Mobile App testing grid
| @ -98,7 +98,7 @@ | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String"></Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String"></Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String"></Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String"></Data></Cell> | ||||
|    </Row> | ||||
|    <Row> | ||||
|  | ||||
							
								
								
									
										14
									
								
								docz/data/mobile.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						| @ -0,0 +1,14 @@ | ||||
| import { read, utils } from 'xlsx'; | ||||
| import url from './mobile.xls'; | ||||
| import React, { useEffect, useState } from 'react'; | ||||
| 
 | ||||
| const FrameworkData = () => { | ||||
|   const [fw, setFW] = useState(""); | ||||
| 
 | ||||
|   useEffect(() => { (async() => { | ||||
|     const wb = read(await (await fetch(url)).arrayBuffer(), { dense: true }); | ||||
|     setFW(utils.sheet_to_html(wb.Sheets["Frameworks"])); | ||||
|   })(); }, []); | ||||
|   return ( <div dangerouslySetInnerHTML={{__html: fw}}/> ); | ||||
| }; | ||||
| export default FrameworkData; | ||||
							
								
								
									
										154
									
								
								docz/data/mobile.xls
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						| @ -0,0 +1,154 @@ | ||||
| <?xml version="1.0"?> | ||||
| <?mso-application progid="Excel.Sheet"?> | ||||
| <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> | ||||
|  <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> | ||||
|   <WindowHeight>10620</WindowHeight> | ||||
|   <WindowWidth>11020</WindowWidth> | ||||
|   <WindowTopX>2260</WindowTopX> | ||||
|   <WindowTopY>19600</WindowTopY> | ||||
|   <ActiveSheet>1</ActiveSheet> | ||||
|   <ProtectStructure>False</ProtectStructure> | ||||
|   <ProtectWindows>False</ProtectWindows> | ||||
|  </ExcelWorkbook> | ||||
|  <Styles> | ||||
|   <Style ss:ID="Default" ss:Name="Normal"> | ||||
|    <Alignment ss:Vertical="Bottom"/> | ||||
|    <Borders/> | ||||
|    <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="12" ss:Color="#000000"/> | ||||
|    <Interior/> | ||||
|    <NumberFormat/> | ||||
|    <Protection/> | ||||
|   </Style> | ||||
|   <Style ss:ID="s16"> | ||||
|    <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="12" ss:Color="#1C1E21"/> | ||||
|   </Style> | ||||
|   <Style ss:ID="s17"> | ||||
|    <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="12" ss:Color="#000000" ss:Bold="1"/> | ||||
|   </Style> | ||||
|   <Style ss:ID="s19"> | ||||
|    <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/> | ||||
|    <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="12" ss:Color="#000000" ss:Bold="1"/> | ||||
|   </Style> | ||||
|   <Style ss:ID="s20"> | ||||
|    <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="12" ss:Color="#467886" ss:Underline="Single"/> | ||||
|   </Style> | ||||
|  </Styles> | ||||
|  <Worksheet ss:Name="Frameworks"> | ||||
|   <Table ss:ExpandedColumnCount="8" ss:ExpandedRowCount="17" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="65" ss:DefaultRowHeight="16"> | ||||
|    <Column ss:Index="3" ss:Width="24"/> | ||||
|    <Column ss:Width="31"/> | ||||
|    <Column ss:Width="24"/> | ||||
|    <Column ss:Width="31"/> | ||||
|    <Column ss:Width="24"/> | ||||
|    <Column ss:Width="31"/> | ||||
|    <Row> | ||||
|     <Cell ss:StyleID="s17"><Data ss:Type="String"></Data></Cell> | ||||
|     <Cell ss:MergeAcross="1" ss:StyleID="s19"><Data ss:Type="String">Real Device</Data></Cell> | ||||
|     <Cell ss:MergeAcross="1" ss:StyleID="s19"><Data ss:Type="String">MacOS Sim</Data></Cell> | ||||
|     <Cell ss:MergeAcross="1" ss:StyleID="s19"><Data ss:Type="String">Windows Sim</Data></Cell> | ||||
|     <Cell ss:MergeAcross="1" ss:StyleID="s19"><Data ss:Type="String">Linux Sim</Data></Cell> | ||||
|    </Row> | ||||
|    <Row> | ||||
|     <Cell ss:StyleID="s17"><Data ss:Type="String">Platform</Data></Cell> | ||||
|     <Cell ss:StyleID="s17"><Data ss:Type="String">iOS</Data></Cell> | ||||
|     <Cell ss:StyleID="s17"><Data ss:Type="String">Android</Data></Cell> | ||||
|     <Cell ss:StyleID="s17"><Data ss:Type="String">iOS</Data></Cell> | ||||
|     <Cell ss:StyleID="s17"><Data ss:Type="String">Android</Data></Cell> | ||||
|     <Cell ss:StyleID="s17"><Data ss:Type="String">iOS</Data></Cell> | ||||
|     <Cell ss:StyleID="s17"><Data ss:Type="String">Android</Data></Cell> | ||||
|     <Cell ss:StyleID="s17"><Data ss:Type="String">iOS</Data></Cell> | ||||
|     <Cell ss:StyleID="s17"><Data ss:Type="String">Android</Data></Cell> | ||||
|    </Row> | ||||
|    <Row> | ||||
|     <Cell ss:StyleID="s20" ss:HRef="/docs/demos/mobile/reactnative"><Data ss:Type="String">React Native</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✘</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✘</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|    </Row> | ||||
|    <Row> | ||||
|     <Cell ss:StyleID="s20" ss:HRef="/docs/demos/mobile/nativescript"><Data ss:Type="String">NativeScript</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✘</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✘</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String"> </Data></Cell> | ||||
|    </Row> | ||||
|    <Row> | ||||
|     <Cell ss:StyleID="s20" ss:HRef="/docs/demos/mobile/capacitor"><Data ss:Type="String">CapacitorJS</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✘</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✘</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String"> </Data></Cell> | ||||
|    </Row> | ||||
|    <Row> | ||||
|     <Cell ss:StyleID="s20" ss:HRef="/docs/demos/mobile/ionic"><Data ss:Type="String">Ionic</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✘</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String"> </Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✘</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String"> </Data></Cell> | ||||
|    </Row> | ||||
|    <Row> | ||||
|     <Cell ss:StyleID="s20" ss:HRef="/docs/demos/mobile/flutter"><Data ss:Type="String">Dart + Flutter</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✘</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String"> </Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✘</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String"> </Data></Cell> | ||||
|    </Row> | ||||
|    <Row> | ||||
|     <Cell ss:StyleID="s20" ss:HRef="/docs/demos/mobile/quasar"><Data ss:Type="String">Quasar</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✔</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✘</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String"> </Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String">✘</Data></Cell> | ||||
|     <Cell ss:StyleID="s16"><Data ss:Type="String"> </Data></Cell> | ||||
|    </Row> | ||||
|   </Table> | ||||
|   <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> | ||||
|    <PageSetup> | ||||
|     <Header x:Margin="0.3"/> | ||||
|     <Footer x:Margin="0.3"/> | ||||
|     <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/> | ||||
|    </PageSetup> | ||||
|    <FreezePanes/> | ||||
|    <FrozenNoSplit/> | ||||
|    <SplitHorizontal>2</SplitHorizontal> | ||||
|    <TopRowBottomPane>2</TopRowBottomPane> | ||||
|    <ActivePane>2</ActivePane> | ||||
|    <Panes> | ||||
|     <Pane> | ||||
|      <Number>3</Number> | ||||
|     </Pane> | ||||
|     <Pane> | ||||
|      <Number>2</Number> | ||||
|      <ActiveRow>12</ActiveRow> | ||||
|      <ActiveCol>5</ActiveCol> | ||||
|     </Pane> | ||||
|    </Panes> | ||||
|    <ProtectObjects>False</ProtectObjects> | ||||
|    <ProtectScenarios>False</ProtectScenarios> | ||||
|   </WorksheetOptions> | ||||
|  </Worksheet> | ||||
| </Workbook> | ||||
| @ -56,15 +56,15 @@ This demo was tested in the following environments: | ||||
| 
 | ||||
| | OS         | Device              | NS       | Date       | | ||||
| |:-----------|:--------------------|:---------|:-----------| | ||||
| | Android 30 | NVIDIA Shield       | `8.6.5`  | 2024-04-07 | | ||||
| | iOS 15.1   | iPad Pro            | `8.6.1`  | 2023-12-04 | | ||||
| | Android 30 | NVIDIA Shield       | `8.7.2`  | 2024-06-09 | | ||||
| | iOS 15.1   | iPad Pro            | `8.7.2`  | 2024-06-09 | | ||||
| 
 | ||||
| **Simulators** | ||||
| 
 | ||||
| | OS         | Device              | NS       | Dev Platform | Date       | | ||||
| |:-----------|:--------------------|:---------|:-------------|:-----------| | ||||
| | Android 34 | Pixel 3a            | `8.6.1`  | `darwin-x64` | 2023-12-04 | | ||||
| | iOS 17.0.1 | iPhone SE (3rd gen) | `8.6.1`  | `darwin-x64` | 2023-12-04 | | ||||
| | Android 34 | Pixel 3a            | `8.7.2`  | `darwin-arm` | 2024-06-09 | | ||||
| | iOS 17.5   | iPhone SE (3rd gen) | `8.7.2`  | `darwin-arm` | 2024-06-09 | | ||||
| | Android 34 | Pixel 3a            | `8.6.5`  | `win10-x64`  | 2024-04-07 | | ||||
| 
 | ||||
| ::: | ||||
| @ -311,7 +311,7 @@ In the last macOS test, the following output was displayed: | ||||
| <span {...g}>✔</span> Javac is installed and is configured properly. | ||||
| <span {...g}>✔</span> The Java Development Kit (JDK) is installed and is configured properly. | ||||
| <span {...g}>✔</span> Getting NativeScript components versions information... | ||||
| <span {...g}>✔</span> Component nativescript has 8.6.1 version and is up to date. | ||||
| <span {...g}>✔</span> Component nativescript has 8.7.2 version and is up to date. | ||||
| </pre> | ||||
| 
 | ||||
| </details> | ||||
| @ -338,10 +338,9 @@ In the last macOS test, the following output was displayed: | ||||
| <span {...g}>✔</span> CocoaPods are configured properly. | ||||
| <span {...g}>✔</span> Your current CocoaPods version is newer than 1.0.0. | ||||
| <span {...g}>✔</span> Python installed and configured correctly. | ||||
| <span {...g}>✔</span> The Python 'six' package is found. | ||||
| <span {...g}>✔</span> Xcode version 15.0.1 satisfies minimum required version 10. | ||||
| <span {...g}>✔</span> Xcode version 15.4.0 satisfies minimum required version 10. | ||||
| <span {...g}>✔</span> Getting NativeScript components versions information... | ||||
| <span {...g}>✔</span> Component nativescript has 8.6.1 version and is up to date. | ||||
| <span {...g}>✔</span> Component nativescript has 8.7.2 version and is up to date. | ||||
| </pre> | ||||
| 
 | ||||
| </details> | ||||
| @ -798,7 +797,11 @@ file named `SheetJSNS.xls`. | ||||
| 
 | ||||
| 35) Close any Android / iOS emulators. | ||||
| 
 | ||||
| 36) Enable developer code signing certificates[^9] | ||||
| 36) Enable developer code signing certificates: | ||||
| 
 | ||||
| Open `platforms/ios/SheetJSNS.xcodeproj/project.xcworkspace` in Xcode. Select | ||||
| the "Project Navigator" and select the "App" project. In the main view, select | ||||
| "Signing & Capabilities". Under "Signing", select a team in the dropdown menu. | ||||
| 
 | ||||
| 37) Run on device: | ||||
| 
 | ||||
| @ -806,12 +809,23 @@ file named `SheetJSNS.xls`. | ||||
| npx -p nativescript ns run ios | ||||
| ``` | ||||
| 
 | ||||
| <details open> | ||||
|   <summary><b>iOS Device Testing</b> (click to hide)</summary> | ||||
| 
 | ||||
| When the app launches, if the SheetJS library is loaded and if the device is | ||||
| connected to the Internet, a list of Presidents should be displayed. | ||||
| 
 | ||||
| Tap "Export File". The app will show an alert. Tap "OK". | ||||
| 
 | ||||
| Switch to the "Files" app and open the "Downloads" folder. There should be a new | ||||
| file named `SheetJSNS.xls`. | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| [^1]: See [`read` in "Reading Files"](/docs/api/parse-options) | ||||
| [^2]: See ["Workbook Object"](/docs/csf/book) | ||||
| [^3]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/array#array-output) | ||||
| [^4]: See [`write` in "Writing Files"](/docs/api/write-options) | ||||
| [^5]: See [`json_to_sheet` in "Utilities"](/docs/api/utilities/array#array-of-objects-input) | ||||
| [^6]: See ["Workbook Helpers" in "Utilities"](/docs/api/utilities/wb) for details on `book_new` and `book_append_sheet`. | ||||
| [^7]: See [`read` in "Reading Files"](/docs/api/parse-options) | ||||
| [^8]: See ["Local setup"](https://docs.nativescript.org/setup/#local-setup) in the NativeScript documentation. For Windows and Linux, follow the "Android" instructions. For macOS, follow both the iOS and Android instructions. | ||||
| [^9]: The [Flutter documentation](https://docs.flutter.dev/get-started/install/macos?tab=ios15#enable-developer-code-signing-certificates) covers the instructions in more detail. The correct workspace is `platforms/ios/SheetJSNS.xcodeproj/project.xcworkspace` | ||||
| [^7]: See [`read` in "Reading Files"](/docs/api/parse-options) | ||||
| @ -41,12 +41,19 @@ The ["Demo"](#demo) creates an app that looks like the screenshots below: | ||||
| 
 | ||||
| This demo was tested in the following environments: | ||||
| 
 | ||||
| **Real Devices** | ||||
| 
 | ||||
| | OS         | Device              | Quasar   | Date       | | ||||
| |:-----------|:--------------------|:---------|:-----------| | ||||
| | Android 30 | NVIDIA Shield       | `2.16.4` | 2024-06-09 | | ||||
| | iOS 15.1   | iPad Pro            | `2.16.4` | 2024-06-09 | | ||||
| 
 | ||||
| **Simulators** | ||||
| 
 | ||||
| | OS         | Device              | Quasar   | Dev Platform | Date       | | ||||
| |:-----------|:--------------------|:---------|:-------------|:-----------| | ||||
| | Android 34 | Pixel 3a            | `2.14.1` | `darwin-x64` | 2023-12-04 | | ||||
| | iOS 17.0.1 | iPhone SE (3rd gen) | `2.14.1` | `darwin-x64` | 2023-12-04 | | ||||
| | Android 34 | Pixel 3a            | `2.16.4` | `darwin-arm` | 2024-06-09 | | ||||
| | iOS 17.5   | iPhone SE (3rd gen) | `2.16.4` | `darwin-arm` | 2024-06-09 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| @ -167,6 +174,13 @@ npm i -g @quasar/cli cordova | ||||
| 
 | ||||
| (you may need to run `sudo npm i -g` if there are permission issues) | ||||
| 
 | ||||
| <details> | ||||
|   <summary><b>Installation Notes</b> (click to show)</summary> | ||||
| 
 | ||||
| Quasar requires Java 17 | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| 1) Create a new app: | ||||
| 
 | ||||
| ```bash | ||||
| @ -177,19 +191,19 @@ npm init quasar | ||||
| 
 | ||||
| When prompted: | ||||
| 
 | ||||
| - "What would you like to build?": `App with Quasar CLI` | ||||
| - "What would you like to build?": `App with Quasar CLI, let's go!` | ||||
| - "Project folder": `SheetJSQuasar` | ||||
| - "Pick Quasar version": `Quasar v2 (Vue 3 | latest and greatest)` | ||||
| - "Pick script type": `Typescript` | ||||
| - "Pick Quasar App CLI variant": `Quasar App CLI with Vite` | ||||
| - "Package name": (just press enter, it will use the default `sheetjsquasar` | ||||
| - "Package name": (press <kbd>Enter</kbd>, it will use the default `sheetjsquasar`) | ||||
| - "Project product name": `SheetJSQuasar` | ||||
| - "Project description": `SheetJS + Quasar` | ||||
| - "Author": (just press enter, it will use your git config settings) | ||||
| - "Author": (press <kbd>Enter</kbd>, it will use your git config settings) | ||||
| - "Pick a Vue component style": `Composition API` | ||||
| - "Pick your CSS preprocessor": `None` | ||||
| - "Check the features needed for your project": Deselect everything | ||||
| - "Install project dependencies": `No` | ||||
| - "Check the features needed for your project": Deselect everything (scroll down to each selected item and press <kbd>Space</kbd>) | ||||
| - "Install project dependencies": `Yes, use npm` | ||||
| 
 | ||||
| 2) Install dependencies: | ||||
| 
 | ||||
| @ -236,7 +250,7 @@ Return to the project directory: | ||||
| cd .. | ||||
| ``` | ||||
| 
 | ||||
| 11) Enable file sharing and make the documents folder visible in the iOS app. | ||||
| 4) Enable file sharing and make the documents folder visible in the iOS app. | ||||
| The following lines must be added to `src-cordova/platforms/ios/SheetJSQuasar/SheetJSQuasar-Info.plist`: | ||||
| 
 | ||||
| ```xml title="src-cordova/platforms/ios/SheetJSQuasar/SheetJSQuasar-Info.plist (add to file)" | ||||
| @ -260,6 +274,8 @@ The following lines must be added to `src-cordova/platforms/ios/SheetJSQuasar/Sh | ||||
| quasar dev -m ios | ||||
| ``` | ||||
| 
 | ||||
| If prompted to select an external IP, press <kbd>Enter</kbd>. | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
| If the app is blank or not refreshing, delete the app and close the simulator, | ||||
| @ -269,7 +285,7 @@ then restart the development process. | ||||
| 
 | ||||
| 6) Add the Dialog plugin to `quasar.config.js`: | ||||
| 
 | ||||
| ```js title="quasar.config.js" | ||||
| ```js title="quasar.config.js (add highlighted line)" | ||||
|     framework: { | ||||
|       config: {}, | ||||
| // ... | ||||
| @ -282,7 +298,7 @@ then restart the development process. | ||||
| 7) In the template section of `src/pages/IndexPage.vue`, replace the example | ||||
|    with a Table, Save button and Load file picker component: | ||||
| 
 | ||||
| ```html title="src/pages/IndexPage.vue" | ||||
| ```html title="src/pages/IndexPage.vue (change highlighted lines)" | ||||
| <template> | ||||
|   <q-page class="row items-center justify-evenly"> | ||||
|     <!-- highlight-start --> | ||||
| @ -298,7 +314,7 @@ then restart the development process. | ||||
| 
 | ||||
| This uses two functions that should be added to the component script: | ||||
| 
 | ||||
| ```ts title="src/pages/IndexPage.vue" | ||||
| ```ts title="src/pages/IndexPage.vue (add highlighted lines)" | ||||
|     const meta = ref<Meta>({ | ||||
|       totalCount: 1200 | ||||
|     }); | ||||
| @ -326,7 +342,7 @@ then restart the development process. | ||||
| 
 | ||||
| 8) Wire up the `updateFile` function: | ||||
| 
 | ||||
| ```ts title="src/pages/IndexPage.vue" | ||||
| ```ts title="src/pages/IndexPage.vue (add highlighted lines)" | ||||
| import { defineComponent, ref } from 'vue'; | ||||
| // highlight-start | ||||
| import { read, write, utils } from 'xlsx'; | ||||
| @ -375,7 +391,7 @@ Once selected, the screen should refresh with new contents. | ||||
| 
 | ||||
| 9) Wire up the `saveFile` function: | ||||
| 
 | ||||
| ```ts title="src/pages/IndexPage.vue" | ||||
| ```ts title="src/pages/IndexPage.vue (add highlighted lines)" | ||||
|     function saveFile() { | ||||
| // highlight-start | ||||
|       /* generate workbook from state */ | ||||
| @ -473,6 +489,8 @@ cd .. | ||||
| quasar dev -m android | ||||
| ``` | ||||
| 
 | ||||
| If prompted to select an external IP, press <kbd>Enter</kbd>. | ||||
| 
 | ||||
| To test that reading works: | ||||
| 
 | ||||
| - Click and drag `pres.numbers` from a Finder window into the simulator. | ||||
| @ -489,6 +507,80 @@ adb exec-out run-as org.sheetjs.quasar cat files/files/SheetJSQuasar.xlsx > /tmp | ||||
| npx xlsx-cli /tmp/SheetJSQuasar.xlsx | ||||
| ``` | ||||
| 
 | ||||
| **iOS Device** | ||||
| 
 | ||||
| 12) Close all open emulators and simulators. | ||||
| 
 | ||||
| 13) Disconnect any iOS or Android devices connected to the computer. | ||||
| 
 | ||||
| 14) Connect the iOS device to the computer. | ||||
| 
 | ||||
| 15) Open the Xcode project: | ||||
| 
 | ||||
| ```bash | ||||
| open src-cordova/platforms/ios/SheetJSQuasar.xcodeproj | ||||
| ``` | ||||
| 
 | ||||
| Select "SheetJSQuasar" in the Navigator. In the main pane, select "Signing & | ||||
| Capabilities" and ensure a Team is selected. Save and close the project. | ||||
| 
 | ||||
| 16) Start the dev process: | ||||
| 
 | ||||
| ```bash | ||||
| quasar dev -m ios | ||||
| ``` | ||||
| 
 | ||||
| If prompted to select an external IP, press <kbd>Enter</kbd>. | ||||
| 
 | ||||
| 17) Test the application: | ||||
| 
 | ||||
| - Press the Home button (or swipe up with one finger) and switch to Safari. | ||||
| - Download https://docs.sheetjs.com/pres.numbers | ||||
| - Press the Home button (or swipe up with one finger) and select the `SheetJSQuasar` app | ||||
| - Tap the "Load" button, then select "Choose File" and select the downloaded `pres.numbers` | ||||
| 
 | ||||
| The table will update with new data. | ||||
| 
 | ||||
| - Tap "Save File" | ||||
| - Press the Home button (or swipe up with one finger) and switch to Files. | ||||
| - Tap `<` until the main "Browse" window is displayed, then select "On My iPhone" | ||||
| - Look for the "SheetJSQuasar" folder and tap `SheetJSQuasar.xlsx`. | ||||
| 
 | ||||
| If Numbers is installed on the device, it will display the contents of the new file. | ||||
| 
 | ||||
| **Android Device** | ||||
| 
 | ||||
| 18) Close all open emulators and simulators. | ||||
| 
 | ||||
| 19) Disconnect any iOS or Android devices connected to the computer. | ||||
| 
 | ||||
| 20) Connect the Android device to the computer. | ||||
| 
 | ||||
| 21) Start the dev process: | ||||
| 
 | ||||
| ```bash | ||||
| quasar dev -m android | ||||
| ``` | ||||
| 
 | ||||
| If prompted to select an external IP, press <kbd>Enter</kbd>. | ||||
| 
 | ||||
| 22) Test the application: | ||||
| 
 | ||||
| - Press the Home button (or swipe up with one finger) and switch to Browser. | ||||
| - Download https://docs.sheetjs.com/pres.numbers | ||||
| - Press the Home button (or swipe up with one finger) and select the `SheetJSQuasar` app | ||||
| - Tap the "Load" button, then select "Choose File" and select the downloaded `pres.numbers` | ||||
| 
 | ||||
| The table will update with new data. | ||||
| 
 | ||||
| :::warning pass | ||||
| 
 | ||||
| The "Save File" process will write files. However, Android 30+ requires special | ||||
| methods ("Storage Access Framework") that are not implemented in Quasar. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| 
 | ||||
| [^1]: See ["File Picker"](https://quasar.dev/vue-components/file-picker) in the Quasar documentation. | ||||
| [^2]: See [`read` in "Reading Files"](/docs/api/parse-options) | ||||
| [^3]: See ["SheetJS Data Model"](/docs/csf/) for more details on workbooks, worksheets, and other concepts. | ||||
|  | ||||
| @ -53,29 +53,21 @@ This demo was tested in the following environments: | ||||
| 
 | ||||
| | OS         | Device              | Config | Date       | | ||||
| |:-----------|:--------------------|:-------|:-----------| | ||||
| | Android 30 | NVIDIA Shield       | B      | 2024-05-30 | | ||||
| | iOS 15.1   | iPad Pro            | B      | 2024-05-30 | | ||||
| | Android 30 | NVIDIA Shield       | A      | 2024-05-30 | | ||||
| | iOS 15.1   | iPad Pro            | A      | 2024-05-30 | | ||||
| 
 | ||||
| **Simulators** | ||||
| 
 | ||||
| | OS         | Device              | Config | Dev Platform | Date       | | ||||
| |:-----------|:--------------------|:-------|:-------------|:-----------| | ||||
| | Android 34 | Pixel 3a            | A      | `darwin-x64` | 2023-12-04 | | ||||
| | iOS 17.0.1 | iPhone SE (3rd gen) | A      | `darwin-x64` | 2023-12-04 | | ||||
| | Android 34 | Pixel 3a            | B      | `darwin-arm` | 2024-05-30 | | ||||
| | iOS 17.5   | iPhone SE (3rd gen) | B      | `darwin-arm` | 2024-05-30 | | ||||
| | Android 34 | Pixel 3a            | A      | `darwin-arm` | 2024-05-30 | | ||||
| | iOS 17.5   | iPhone SE (3rd gen) | A      | `darwin-arm` | 2024-05-30 | | ||||
| 
 | ||||
| <details> | ||||
|   <summary><b>Configurations</b> (click to show)</summary> | ||||
| 
 | ||||
| Configuration A: | ||||
| 
 | ||||
| - Ionic: `@ionic/angular 7.5.7`, `@ionic/angular-toolkit 9.0.0` | ||||
| - Cordova: `cordova-lib@12.0.1`, `android 12.0.1, ios 7.0.1` | ||||
| - File Integration: `@awesome-cordova-plugins/file` version `6.4.0` | ||||
| 
 | ||||
| Configuration B: | ||||
| 
 | ||||
| - Ionic: `@ionic/angular 8.2.0`, `@ionic/angular-toolkit 11.0.1` | ||||
| - Cordova: `cordova-lib@12.0.1`, `android 13.0.0, ios 7.1.0` | ||||
| - File Integration: `@awesome-cordova-plugins/file` version `6.7.0` | ||||
|  | ||||
| @ -1,17 +1,27 @@ | ||||
| --- | ||||
| title: iOS and Android Apps | ||||
| title: Tables on Tablets and Mobile Devices | ||||
| sidebar_label: iOS and Android Apps | ||||
| pagination_prev: demos/static/index | ||||
| pagination_next: demos/desktop/index | ||||
| hide_table_of_contents: true | ||||
| --- | ||||
| 
 | ||||
| import EngineData from '/data/mobile.js' | ||||
| import DocCardList from '@theme/DocCardList'; | ||||
| import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; | ||||
| 
 | ||||
| [SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing | ||||
| data from spreadsheets. | ||||
| 
 | ||||
| Many mobile app frameworks mix JavaScript / CSS / HTML5 concepts with native | ||||
| extensions and libraries to create a hybrid development experience.  Developers | ||||
| well-versed in web technologies can now build actual mobile applications that | ||||
| run on iOS and Android! | ||||
| 
 | ||||
| The demos in this section showcase a number of mobile frameworks. In each case, | ||||
| we will build a sample app that loads SheetJS library scripts and processes | ||||
| on-device and remote spreadsheet files. | ||||
| 
 | ||||
| :::danger pass | ||||
| 
 | ||||
| **The ecosystem has broken backwards-compatibility many times!** | ||||
| @ -24,10 +34,6 @@ MacOS is required for the iOS demos.  The Android demos were tested on MacOS. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| The ["JavaScript Engines"](/docs/demos/engines) section includes samples for JS | ||||
| engines used in the mobile app frameworks.  SheetJS libraries have been tested | ||||
| in the relevant engines and should "just work" with some caveats. | ||||
| 
 | ||||
| Demos for common tools are included in separate pages.  Each demo section will | ||||
| mention test dates and platform versions. | ||||
| 
 | ||||
| @ -40,6 +46,14 @@ mention test dates and platform versions. | ||||
|   </li>); | ||||
| })}</ul> | ||||
| 
 | ||||
| :::info pass | ||||
| 
 | ||||
| The ["JavaScript Engines"](/docs/demos/engines) section includes samples for JS | ||||
| engines used in the mobile app frameworks.  SheetJS libraries have been tested | ||||
| in the relevant engines. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| :::note Recommendation | ||||
| 
 | ||||
| React Native is extremely popular and is the recommended choice for greenfield | ||||
| @ -57,3 +71,16 @@ for features that must be included, or for teams that are comfortable with | ||||
| native app development, React Native is the obvious choice. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ### Platforms | ||||
| 
 | ||||
| The following frameworks have been tested: | ||||
| 
 | ||||
| <EngineData/> | ||||
| 
 | ||||
| :::info pass | ||||
| 
 | ||||
| When this table was last updated, it was not possible to build an iOS app from | ||||
| Linux or Windows. Android tooling runs on MacOS, Linux and Windows. | ||||
| 
 | ||||
| ::: | ||||
|  | ||||
| @ -81,6 +81,7 @@ This demo was last tested in the following deployments: | ||||
| |:-------------|:---------|:-----------| | ||||
| | `darwin-x64` | `1.1.10` | 2024-05-28 | | ||||
| | `darwin-arm` | `1.1.10` | 2024-05-29 | | ||||
| | `linux-x64`  | `1.1.12` | 2024-06-09 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
|  | ||||
| @ -4,10 +4,6 @@ pagination_prev: demos/bigdata/index | ||||
| pagination_next: solutions/input | ||||
| --- | ||||
| 
 | ||||
| import current from '/version.js'; | ||||
| import Tabs from '@theme/Tabs'; | ||||
| import TabItem from '@theme/TabItem'; | ||||
| import CodeBlock from '@theme/CodeBlock'; | ||||
| import EngineData from '/data/engines.js' | ||||
| 
 | ||||
| [SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing | ||||
|  | ||||
| Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 61 KiB | 
| Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 42 KiB | 
| Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 22 KiB | 
| Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 71 KiB | 
| Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 73 KiB |