@fto-consult/expo-ui 7.1.5 → 7.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/babel.config.alias.js +1 -0
- package/package.json +2 -2
- package/src/components/Datagrid/Common/Common.js +10 -23
- package/src/components/Dialog/DialogContent.js +4 -1
- package/src/components/Form/Fields/Field.js +2 -2
- package/src/pdf/Reader/index.web.js +178 -0
- package/src/pdf/index.js +130 -0
- package/src/screens/Help/openLibraries.js +1 -1
package/babel.config.alias.js
CHANGED
@@ -93,6 +93,7 @@ module.exports = (opts)=>{
|
|
93
93
|
r.$electron = r.$electron || r.$eelectron;
|
94
94
|
r.$projectRoot = r.$eprojectRoot = projectRoot;
|
95
95
|
r.$econtext = path.resolve(expo,"context");
|
96
|
+
r.$epdf = path.resolve(expo,"pdf");
|
96
97
|
if(!r.$context){
|
97
98
|
r.$context = r.$econtext;
|
98
99
|
}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@fto-consult/expo-ui",
|
3
|
-
"version": "7.1.
|
3
|
+
"version": "7.1.7",
|
4
4
|
"description": "Bibliothèque de composants UI Expo,react-native",
|
5
5
|
"main": "main",
|
6
6
|
"scripts": {
|
@@ -71,7 +71,7 @@
|
|
71
71
|
"@expo/html-elements": "^0.5.1",
|
72
72
|
"@expo/vector-icons": "^13.0.0",
|
73
73
|
"@faker-js/faker": "^8.0.2",
|
74
|
-
"@fto-consult/common": "^3.
|
74
|
+
"@fto-consult/common": "^3.71.30",
|
75
75
|
"@pchmn/expo-material3-theme": "^1.3.1",
|
76
76
|
"@react-native-async-storage/async-storage": "1.18.2",
|
77
77
|
"@react-native-community/datetimepicker": "7.2.0",
|
@@ -43,8 +43,9 @@ import {parseMangoQueries} from "$ecomponents/Filter";
|
|
43
43
|
import events from "../events";
|
44
44
|
import {MORE_ICON} from "$ecomponents/Icon"
|
45
45
|
import ActivityIndicator from "$ecomponents/ActivityIndicator";
|
46
|
-
import {
|
46
|
+
import {createTableHeader,fields as pdfFields,pageHeaderMargin,sprintf as pdfSprintf} from "$cpdf";
|
47
47
|
import {isWeb,isMobileNative} from "$cplatform";
|
48
|
+
import { createPDF,getFields as getPdfFields } from '../../../pdf';
|
48
49
|
|
49
50
|
export const TIMEOUT = 100;
|
50
51
|
|
@@ -842,12 +843,12 @@ export default class CommonDatagridComponent extends AppComponent {
|
|
842
843
|
}
|
843
844
|
if(isFunction(print)){
|
844
845
|
if(isFunction(printable)){
|
845
|
-
printable = printable({context:this,props:this.props});
|
846
|
+
printable = printable({context:this,tableName:defaultStr(this.props.tableName,this.props.table),props:this.props});
|
846
847
|
}
|
847
848
|
if(printable !== false){
|
848
849
|
r.push({
|
849
|
-
icon : defaultVal(this.props.
|
850
|
-
text : defaultVal(this.props.printButtonText,this.props.
|
850
|
+
icon : defaultVal(this.props.printButtonIcon,'printer'),
|
851
|
+
text : defaultVal(this.props.printButtonText,this.props.printButtonLabel,'Imprimer'),
|
851
852
|
onPress : ()=>{
|
852
853
|
print({title:defaultStr(this.props.title),...defaultObj(printOptions),...sArgs});
|
853
854
|
},
|
@@ -1765,20 +1766,8 @@ export default class CommonDatagridComponent extends AppComponent {
|
|
1765
1766
|
const isOnlytotal = this.state.displayOnlySectionListHeaders;
|
1766
1767
|
const displayOnlyHeader = this.canDisplayOnlySectionListHeaders() && isOnlytotal;
|
1767
1768
|
const sData = defaultObj(this.getSessionData(skey));
|
1768
|
-
const sFields = pdf ? extendObj({},pdfFields) : {};
|
1769
1769
|
const pdfConfig = this.getPdfConfig();
|
1770
|
-
|
1771
|
-
delete sFields.label;
|
1772
|
-
if(!isDataURL(pdfConfig.logo)){
|
1773
|
-
delete sFields.displayLogo;
|
1774
|
-
delete sFields.logoWidth;
|
1775
|
-
}
|
1776
|
-
const rPdfFields = pdf ? {
|
1777
|
-
pdfDocumentTitle : {
|
1778
|
-
text : "Titre du document",
|
1779
|
-
multiple : true,
|
1780
|
-
},
|
1781
|
-
} : {};
|
1770
|
+
const sFields = pdf ? getPdfFields (pdfConfig) : {};
|
1782
1771
|
return new Promise((resolve,reject)=>{
|
1783
1772
|
return DialogProvider.open({
|
1784
1773
|
title : `Paramètre d'export ${excel?"excel":"pdf"}`,
|
@@ -1801,7 +1790,6 @@ export default class CommonDatagridComponent extends AppComponent {
|
|
1801
1790
|
defaultValue : 0,
|
1802
1791
|
type : "switch",
|
1803
1792
|
} : null,
|
1804
|
-
...rPdfFields,
|
1805
1793
|
...sFields,
|
1806
1794
|
},
|
1807
1795
|
actions : [{text:'Exporter',icon : "check"}],
|
@@ -1856,11 +1844,7 @@ export default class CommonDatagridComponent extends AppComponent {
|
|
1856
1844
|
if(pdfDocumentTitle){
|
1857
1845
|
content.unshift(pdfDocumentTitle);
|
1858
1846
|
}
|
1859
|
-
|
1860
|
-
config.hidePreloader = typeof config.hidePreloader =="function"? config.hidePreloader : Preloader.close;
|
1861
|
-
const pdf = createPDF({
|
1862
|
-
content,
|
1863
|
-
},config);
|
1847
|
+
const pdf = createPDF({content},config);
|
1864
1848
|
if(isWeb()){
|
1865
1849
|
return pdf.open();
|
1866
1850
|
}
|
@@ -4024,6 +4008,9 @@ CommonDatagridComponent.propTypes = {
|
|
4024
4008
|
getRowKey : PropTypes.func,
|
4025
4009
|
///la fonction utilisée pour l'impression du datagrid
|
4026
4010
|
print : PropTypes.func,
|
4011
|
+
printButtonIcon : PropTypes.oneOfType([PropTypes.string,PropTypes.element]),
|
4012
|
+
printButtonLabel : PropTypes.oneOfType([PropTypes.string,PropTypes.element]),
|
4013
|
+
printButtonText : PropTypes.oneOfType([PropTypes.string,PropTypes.element]),
|
4027
4014
|
printOptions: PropTypes.object,
|
4028
4015
|
/*** si le datagrid est imprimable */
|
4029
4016
|
printable : PropTypes.oneOfType([
|
@@ -1,7 +1,10 @@
|
|
1
1
|
import KeyboardAvoidingView from "../KeyboardAvoidingView";
|
2
2
|
import React from "$react";
|
3
|
+
import {usePageDimensions} from "$cdimensions/utils";
|
3
4
|
|
4
5
|
const DialogContentComponent = ({isPreloader,title,children,isFullScreen,...props})=>{
|
5
|
-
|
6
|
+
usePageDimensions();
|
7
|
+
return React.useMemo(()=>children,[children]);
|
8
|
+
//return content;
|
6
9
|
}
|
7
10
|
export default DialogContentComponent;
|
@@ -69,7 +69,7 @@ export default class Field extends AppComponent {
|
|
69
69
|
},
|
70
70
|
isEditableBySymbol : {
|
71
71
|
value : ()=>{
|
72
|
-
return
|
72
|
+
return typeof this[this.isEditableSymbol] ==='boolean'? this[this.isEditableSymbol] : true;
|
73
73
|
}
|
74
74
|
},
|
75
75
|
isEnabledBySymbol : {
|
@@ -921,7 +921,7 @@ export default class Field extends AppComponent {
|
|
921
921
|
rest.readOnly = readOnly;
|
922
922
|
if(disabled || readOnly){
|
923
923
|
this[this.isEditableSymbol] = false;
|
924
|
-
}
|
924
|
+
} else delete this[this.isEditableSymbol];
|
925
925
|
}
|
926
926
|
if(this.state.isFieldVisible){
|
927
927
|
if(isFunction(visible)){
|
@@ -0,0 +1,178 @@
|
|
1
|
+
/**@see : https://github.com/pipwerks/PDFObject#readme */
|
2
|
+
let {Dialog} = require("$components/Dialog")
|
3
|
+
let Icon = require("$components/Icon")
|
4
|
+
require("./styles.css")
|
5
|
+
let PDFObject = require("pdfobject")
|
6
|
+
let {MenuButton} = require("$ui")
|
7
|
+
let isMSE = //checkEdge ? false :
|
8
|
+
window.navigator && typeof window.navigator.msSaveOrOpenBlob == "function" ? true : false;
|
9
|
+
class PDFViewer extends APP.Component {
|
10
|
+
constructor(props){
|
11
|
+
super(props);
|
12
|
+
APP.extend(this._events,{
|
13
|
+
resize : this.resetPos.bind(this)
|
14
|
+
})
|
15
|
+
this.autobind();
|
16
|
+
}
|
17
|
+
|
18
|
+
componentDidMount(){
|
19
|
+
super.componentDidMount();
|
20
|
+
this.updatePdfContent();
|
21
|
+
window.addEventListener('resize',this._events.resize, true)
|
22
|
+
this.resetPos();
|
23
|
+
}
|
24
|
+
resetPos (){
|
25
|
+
if(!this._isMounted()) return;
|
26
|
+
let pdfWrap = document.getElementById(this.pdfViewerWrapperDomId);
|
27
|
+
if(isDOMElement(pdfWrap)){
|
28
|
+
let parent = pdfWrap.parentNode;
|
29
|
+
let mP = pdfWrap.closest(".dialog.md-dialog-container");
|
30
|
+
if(isDOMElement(parent) && isDOMElement(mP)){
|
31
|
+
let maxHeight = mezr.height(parent);
|
32
|
+
let maxH2 = mezr.height(mP);
|
33
|
+
let min = Math.min(maxHeight,maxH2);
|
34
|
+
if(min == 0){
|
35
|
+
min = "100%";
|
36
|
+
} else min = min+"px";
|
37
|
+
pdfWrap.style.height = min;
|
38
|
+
}
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
componentDidUpdate(){
|
43
|
+
super.componentDidUpdate();
|
44
|
+
if(this.dialogRef && this.dialogRef.open){
|
45
|
+
this.dialogRef.open();
|
46
|
+
}
|
47
|
+
this.updatePdfContent()
|
48
|
+
this.resetPos();
|
49
|
+
}
|
50
|
+
componentWillUnmount(){
|
51
|
+
super.componentWillUnmount();
|
52
|
+
this.dialogRef = undefined;
|
53
|
+
window.removeEventListener('resize',this._events.resize, true)
|
54
|
+
this.clearEvents();
|
55
|
+
}
|
56
|
+
viewCapacitor (){
|
57
|
+
let f = window.PreviewAnyFile || (cordova && cordova.plugins.PreviewAnyFile);
|
58
|
+
if(f && f.preview){
|
59
|
+
f = f.preview;
|
60
|
+
let {file} = this.props;
|
61
|
+
APP.FILE.getCapacitorPDFromDataURL({content:file,fileName:this.props.fileName,success:({path})=>{
|
62
|
+
if(isFunction(f)){
|
63
|
+
f(
|
64
|
+
path,
|
65
|
+
function(win){},
|
66
|
+
function(err){
|
67
|
+
console.log(err," pdf viewer in cap android ios")
|
68
|
+
}
|
69
|
+
)
|
70
|
+
}
|
71
|
+
}})
|
72
|
+
}
|
73
|
+
}
|
74
|
+
updatePdfContent(){
|
75
|
+
let file = this.props.file;
|
76
|
+
if (isMSE) {
|
77
|
+
let b64 = dataURLToBase64(file);
|
78
|
+
if(b64){
|
79
|
+
var byteCharacters = atob(b64);
|
80
|
+
var byteNumbers = new Array(byteCharacters.length);
|
81
|
+
for (var i = 0; i < byteCharacters.length; i++) {
|
82
|
+
byteNumbers[i] = byteCharacters.charCodeAt(i);
|
83
|
+
}
|
84
|
+
var byteArray = new Uint8Array(byteNumbers);
|
85
|
+
var blob = new Blob([byteArray], {
|
86
|
+
type: 'application/pdf'
|
87
|
+
});
|
88
|
+
return window.navigator.msSaveOrOpenBlob(blob, defaultStr(this.props.title,'données-impr')+".pdf");
|
89
|
+
}
|
90
|
+
return null;
|
91
|
+
}
|
92
|
+
if(isElectron()){
|
93
|
+
return ELECTRON.PRINTER.preview({
|
94
|
+
content:this.props.file,
|
95
|
+
fileName : this.props.fileName,
|
96
|
+
fileExtension : 'pdf',
|
97
|
+
});
|
98
|
+
}
|
99
|
+
if(isCapacitor(true)){
|
100
|
+
return this.viewCapacitor();
|
101
|
+
}
|
102
|
+
let dom = document.getElementById(this.pdfViewerWrapperDomId);
|
103
|
+
if(isDOMElement(dom)){
|
104
|
+
try {
|
105
|
+
this.pdfInstance = PDFObject.embed(file,dom);
|
106
|
+
} catch (e){
|
107
|
+
console.log(e,' error on loading pdf file')
|
108
|
+
}
|
109
|
+
}
|
110
|
+
}
|
111
|
+
UNSAFE_componentWillReceiveProps(nexProps,prevProps){
|
112
|
+
if(nexProps.file && nexProps.file != this.state.file){
|
113
|
+
this._pageNumber = 1;
|
114
|
+
}
|
115
|
+
}
|
116
|
+
onPrint (args){
|
117
|
+
console.log(args,' was printed');
|
118
|
+
}
|
119
|
+
getPrintSettings(){
|
120
|
+
return defaultObj(this.props.printProps,this.props.printOptions);
|
121
|
+
}
|
122
|
+
render (){
|
123
|
+
if(isMSE || isElectron() || isCapacitor(true)) return null;
|
124
|
+
let {file,dialogProps,title,onPrint,printProps,printOptions,fileName,...rest} = this.props;
|
125
|
+
dialogProps = defaultObj(dialogProps);
|
126
|
+
dialogProps.contentProps = defaultObj(dialogProps.contentProps)
|
127
|
+
dialogProps.contentProps.id = defaultStr(dialogProps.contentProps.id,this.dialogWrapperParentId,uniqid('dialog-content-wrp-par'))
|
128
|
+
this.dialogWrapperParentId = dialogProps.contentProps.id;
|
129
|
+
dialogProps.contentProps.className = classNames(dialogProps.contentProps.className,'no-padding pdf-viewer-dialog-content')
|
130
|
+
dialogProps.className = classNames(dialogProps.className,'pdf-viewer-dialog')
|
131
|
+
dialogProps.title = defaultStr(dialogProps.title,title)
|
132
|
+
rest = defaultObj(rest)
|
133
|
+
let {actions} = dialogProps;
|
134
|
+
let acts = []
|
135
|
+
let mIts = []
|
136
|
+
if(mIts.length > 0){
|
137
|
+
acts.push(
|
138
|
+
<MenuButton
|
139
|
+
menuItems = {mIts}
|
140
|
+
flat
|
141
|
+
id = {uniqid("view-page-id-butt")}
|
142
|
+
>
|
143
|
+
{<Icon name="material-more_vert" title={"pages"}/>}
|
144
|
+
</MenuButton>
|
145
|
+
)
|
146
|
+
}
|
147
|
+
Object.map(actions,(a,i)=>{
|
148
|
+
if(!a) return;
|
149
|
+
acts.push(a);
|
150
|
+
})
|
151
|
+
this.pdfViewerWrapperDomId = defaultStr(this.pdfViewerWrapperDomId,uniqid("pdf-viewer-wrapper-id"))
|
152
|
+
return (
|
153
|
+
<Dialog
|
154
|
+
key = {_uniqid("dialog-pdf-viewer-key-id")}
|
155
|
+
{...dialogProps}
|
156
|
+
ref = {(el)=>{
|
157
|
+
if(el){
|
158
|
+
this.dialogRef = el;
|
159
|
+
}
|
160
|
+
}}
|
161
|
+
fullPage
|
162
|
+
visible
|
163
|
+
actions = {acts}
|
164
|
+
>
|
165
|
+
<div className="pdf-viewer-wrapper w100 h100" id={this.pdfViewerWrapperDomId}></div>
|
166
|
+
</Dialog>
|
167
|
+
);
|
168
|
+
}
|
169
|
+
}
|
170
|
+
|
171
|
+
module.exports = PDFViewer;
|
172
|
+
PDFViewer.PDFObject = PDFObject;
|
173
|
+
|
174
|
+
PDFViewer.propTypes = {
|
175
|
+
...Document.propTypes,
|
176
|
+
/*** méthode appelée lorsque le document est imprimé */
|
177
|
+
onPrint : PropTypes.func,
|
178
|
+
}
|
package/src/pdf/index.js
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
import {createPDF as cCreatePdf,print as cPrint,fields as pdfFields} from "$cpdf";
|
2
|
+
import Preloader from "$preloader";
|
3
|
+
import {extendObj} from "$cutils";
|
4
|
+
import pdfMake from "$cpdf/pdfmake";
|
5
|
+
import notify from "$cnotify";
|
6
|
+
import DialogProvider from "$ecomponents/Form/FormData/DialogProvider";
|
7
|
+
import {isNonNullString,defaultObj,defaultStr} from "$cutils";
|
8
|
+
import session from "$session";
|
9
|
+
|
10
|
+
const {createPdf} = pdfMake;
|
11
|
+
pdfMake.createPdf = (docDefinition,...rest)=>{
|
12
|
+
try {
|
13
|
+
//@see : https://pdfmake.github.io/docs/0.1/getting-started/client-side/methods/
|
14
|
+
const pdf = createPdf(docDefinition,...rest);
|
15
|
+
pdf.print();
|
16
|
+
//pdf.open({}, window)
|
17
|
+
return pdf;
|
18
|
+
} catch(e){
|
19
|
+
console.log(e," generating pdf make create eerrror");
|
20
|
+
notify.error(e);
|
21
|
+
return null;
|
22
|
+
}
|
23
|
+
}
|
24
|
+
|
25
|
+
const prepareOptions = options =>{
|
26
|
+
options = Object.assign({},options);
|
27
|
+
if(typeof options.showPreloader !='function'){
|
28
|
+
options.showPreloader = Preloader.open;
|
29
|
+
}
|
30
|
+
if(typeof options.hidePreloader !=='function'){
|
31
|
+
options.hidePreloader = Preloader.close;
|
32
|
+
}
|
33
|
+
return options;
|
34
|
+
}
|
35
|
+
|
36
|
+
export const createPDF = (docDefinition,...rest)=>{
|
37
|
+
return cCreatePdf(prepareOptions(docDefinition),pdfMake,...rest);
|
38
|
+
}
|
39
|
+
|
40
|
+
export const print = (data,options,...rest)=>{
|
41
|
+
return cPrint(data,prepareOptions(options),pdfMake,...rest)
|
42
|
+
}
|
43
|
+
|
44
|
+
export const getFields = (config)=>{
|
45
|
+
config = Object.assign({},config);
|
46
|
+
const sFields = extendObj({},{
|
47
|
+
pdfDocumentTitle : {
|
48
|
+
text : "Titre du document",
|
49
|
+
multiple : true,
|
50
|
+
}
|
51
|
+
},pdfFields);
|
52
|
+
delete sFields.code;
|
53
|
+
delete sFields.label;
|
54
|
+
if(!isDataURL(config.logo)){
|
55
|
+
delete sFields.displayLogo;
|
56
|
+
delete sFields.logoWidth;
|
57
|
+
}
|
58
|
+
return sFields;
|
59
|
+
}
|
60
|
+
|
61
|
+
/**** get settings data
|
62
|
+
@paramm {multiple},
|
63
|
+
@param {object} formDataProps, les prpops à passer au DialogProvider
|
64
|
+
*/
|
65
|
+
export const getPrintSettings = ({multiple,sessionName,formDataProps,...rest})=>{
|
66
|
+
formDataProps = Object.assign({},formDataProps);
|
67
|
+
const hasSession = isNonNullString(sessionName);
|
68
|
+
if(hasSession){
|
69
|
+
sessionName = sessionName.trim();
|
70
|
+
} else {
|
71
|
+
sessionName = "";
|
72
|
+
}
|
73
|
+
const sessionData = hasSession ? defaultObj(session.get(sessionName)) : {};
|
74
|
+
const config = {...sessionData,...defaultObj(formDataProps.data)};
|
75
|
+
const fields = extendObj(true,{},formDataProps.fields,{
|
76
|
+
duplicateDocOnPage : {
|
77
|
+
text :'Dupliquer le(s) document(s)',
|
78
|
+
type : 'switch',
|
79
|
+
defaultValue : 0,
|
80
|
+
onValidate : ({value,context}) =>{
|
81
|
+
if(context){
|
82
|
+
const pageBreakBeforeEachDoc = context.getField("pageBreakBeforeEachDoc");
|
83
|
+
if(pageBreakBeforeEachDoc){
|
84
|
+
if(value || multiple){
|
85
|
+
pageBreakBeforeEachDoc.enable();
|
86
|
+
} else {
|
87
|
+
pageBreakBeforeEachDoc.disable();
|
88
|
+
}
|
89
|
+
}
|
90
|
+
}
|
91
|
+
}
|
92
|
+
},
|
93
|
+
pageBreakBeforeEachDoc : {
|
94
|
+
text :'Saut de page par document',
|
95
|
+
type : 'switch',
|
96
|
+
defaultValue : 1,
|
97
|
+
checkedTooltip : 'Insérer un saut de page avant chaque nouveau document',
|
98
|
+
uncheckedTooltip : 'Ne pas insérer un saut de page avant chaque nouveau document',
|
99
|
+
getValidValue : ({context,data}) => {
|
100
|
+
if(!context || !context?.isDisabled) return;
|
101
|
+
const v = context?.isDisabled()?0 : context.getValue();
|
102
|
+
if(isObj(data)){
|
103
|
+
data.pageBreakBeforeEachDoc = v;
|
104
|
+
}
|
105
|
+
return v;
|
106
|
+
}
|
107
|
+
}
|
108
|
+
},getFields(formDataProps.data))
|
109
|
+
return new Promise((resolve,reject)=>{
|
110
|
+
return DialogProvider.open({
|
111
|
+
title : "Options d'impression",
|
112
|
+
...formDataProps,
|
113
|
+
data : config,
|
114
|
+
fields,
|
115
|
+
onSuccess : (opts)=>{
|
116
|
+
const {data} = opts;
|
117
|
+
if(hasSession){
|
118
|
+
const sessionD = {};
|
119
|
+
for(let i in fields){
|
120
|
+
sessionD[i] = data[i];
|
121
|
+
}
|
122
|
+
session.set(sessionName,sessionD);
|
123
|
+
}
|
124
|
+
DialogProvider.close();
|
125
|
+
resolve({...opts,fields});
|
126
|
+
},
|
127
|
+
onCancel : reject,
|
128
|
+
})
|
129
|
+
});
|
130
|
+
}
|
@@ -1 +1 @@
|
|
1
|
-
module.exports = {"@fto-consult/expo-ui":{"name":"@fto-consult/expo-ui","version":"7.1.
|
1
|
+
module.exports = {"@fto-consult/expo-ui":{"name":"@fto-consult/expo-ui","version":"7.1.5","repository":{"type":"git","url":"git+https://github.com/borispipo/expo-ui.git"},"homepage":"https://github.com/borispipo/expo-ui#readme"},"@babel/plugin-proposal-export-namespace-from":{"version":"7.18.9","url":"https://babel.dev/docs/en/next/babel-plugin-proposal-export-namespace-from","license":"MIT"},"@emotion/native":{"version":"11.11.0","url":"https://emotion.sh","license":"MIT"},"@emotion/react":{"version":"11.11.1","url":"https://github.com/emotion-js/emotion/tree/main/packages/react","license":"MIT"},"@expo/html-elements":{"version":"0.5.1","url":"https://github.com/expo/expo/tree/main/packages/html-elements","license":"MIT"},"@expo/metro-config":{"version":"0.10.7","url":"https://github.com/expo/expo.git","license":"MIT"},"@expo/vector-icons":{"version":"13.0.0","url":"https://expo.github.io/vector-icons","license":"MIT"},"@expo/webpack-config":{"version":"19.0.0","url":"https://github.com/expo/expo-cli.git","license":"MIT"},"@faker-js/faker":{"version":"8.0.2","url":"https://github.com/faker-js/faker.git","license":"MIT"},"@fto-consult/common":{"version":"3.71.0","url":"https://github.com/borispipo/common#readme","license":"ISC"},"@pchmn/expo-material3-theme":{"version":"1.3.1","url":"https://github.com/pchmn/expo-material3-theme#readme","license":"MIT"},"@react-native-async-storage/async-storage":{"version":"1.18.2","url":"https://github.com/react-native-async-storage/async-storage#readme","license":"MIT"},"@react-native-community/datetimepicker":{"version":"7.2.0","url":"https://github.com/react-native-community/datetimepicker#readme","license":"MIT"},"@react-native-community/netinfo":{"version":"9.3.10","url":"https://github.com/react-native-netinfo/react-native-netinfo#readme","license":"MIT"},"@react-native/assets-registry":{"version":"0.72.0","url":"git@github.com:facebook/react-native.git","license":"MIT"},"@react-navigation/native":{"version":"6.1.9","url":"https://reactnavigation.org","license":"MIT"},"@react-navigation/native-stack":{"version":"6.9.17","url":"https://github.com/software-mansion/react-native-screens#readme","license":"MIT"},"@react-navigation/stack":{"version":"6.3.20","url":"https://reactnavigation.org/docs/stack-navigator/","license":"MIT"},"@shopify/flash-list":{"version":"1.4.3","url":"https://shopify.github.io/flash-list/","license":"MIT"},"apexcharts":{"version":"3.44.2","url":"https://apexcharts.com","license":"MIT"},"babel-plugin-inline-dotenv":{"version":"1.7.0","url":"https://github.com/brysgo/babel-plugin-inline-dotenv#readme","license":"ISC"},"babel-plugin-module-resolver":{"version":"5.0.0","url":"https://github.com/tleunen/babel-plugin-module-resolver.git","license":"MIT"},"expo":{"version":"49.0.21","url":"https://github.com/expo/expo/tree/main/packages/expo","license":"MIT"},"expo-camera":{"version":"13.4.4","url":"https://docs.expo.dev/versions/latest/sdk/camera/","license":"MIT"},"expo-clipboard":{"version":"4.3.1","url":"https://docs.expo.dev/versions/latest/sdk/clipboard","license":"MIT"},"expo-font":{"version":"11.4.0","url":"https://docs.expo.dev/versions/latest/sdk/font/","license":"MIT"},"expo-image-picker":{"version":"14.3.2","url":"https://docs.expo.dev/versions/latest/sdk/imagepicker/","license":"MIT"},"expo-linking":{"version":"5.0.2","url":"https://docs.expo.dev/versions/latest/sdk/linking","license":"MIT"},"expo-sharing":{"version":"11.5.0","url":"https://docs.expo.dev/versions/latest/sdk/sharing/","license":"MIT"},"expo-sqlite":{"version":"11.3.3","url":"https://docs.expo.dev/versions/latest/sdk/sqlite/","license":"MIT"},"expo-status-bar":{"version":"1.6.0","url":"https://docs.expo.dev/versions/latest/sdk/status-bar/","license":"MIT"},"expo-system-ui":{"version":"2.4.0","url":"https://docs.expo.dev/versions/latest/sdk/system-ui","license":"MIT"},"expo-web-browser":{"version":"12.3.2","url":"https://docs.expo.dev/versions/latest/sdk/webbrowser/","license":"MIT"},"file-saver":{"version":"2.0.5","url":"https://github.com/eligrey/FileSaver.js#readme","license":"MIT"},"fs-extra":{"version":"11.2.0","url":"https://github.com/jprichardson/node-fs-extra","license":"MIT"},"google-libphonenumber":{"version":"3.2.33","url":"https://ruimarinho.github.io/google-libphonenumber/","license":"(MIT AND Apache-2.0)"},"htmlparser2-without-node-native":{"version":"3.9.2","url":"git://github.com/fb55/htmlparser2.git","license":"MIT"},"is-plain-obj":{"version":"4.1.0","license":"MIT"},"js-base64":{"version":"3.7.5","license":"BSD-3-Clause"},"pdfmake":{"version":"0.2.8","url":"http://pdfmake.org","license":"MIT"},"process":{"version":"0.11.10","url":"git://github.com/shtylman/node-process.git","license":"MIT"},"prop-types":{"version":"15.8.1","url":"https://facebook.github.io/react/","license":"MIT"},"react":{"version":"18.2.0","url":"https://reactjs.org/","license":"MIT"},"react-content-loader":{"version":"6.2.1","url":"https://github.com/danilowoz/react-content-loader","license":"MIT"},"react-dom":{"version":"18.2.0","url":"https://reactjs.org/","license":"MIT"},"react-native":{"version":"0.72.6","license":"MIT"},"react-native-big-list":{"version":"1.6.1","url":"https://marcocesarato.github.io/react-native-big-list-docs/","license":"GPL-3.0-or-later"},"react-native-blob-util":{"version":"0.18.6","url":"https://github.com/RonRadtke/react-native-blob-util","license":"MIT"},"react-native-get-random-values":{"version":"1.9.0","license":"MIT"},"react-native-iphone-x-helper":{"version":"1.3.1","url":"https://github.com/ptelad/react-native-iphone-x-helper#readme","license":"MIT"},"react-native-mime-types":{"version":"2.4.0","license":"MIT"},"react-native-paper":{"version":"5.11.3","url":"https://callstack.github.io/react-native-paper","license":"MIT"},"react-native-paper-dates":{"version":"0.20.4","url":"https://github.com/web-ridge/react-native-paper-dates#readme","license":"MIT"},"react-native-reanimated":{"version":"3.3.0","url":"https://github.com/software-mansion/react-native-reanimated#readme","license":"MIT"},"react-native-safe-area-context":{"version":"4.6.3","url":"https://github.com/th3rdwave/react-native-safe-area-context#readme","license":"MIT"},"react-native-screens":{"version":"3.22.1","url":"https://github.com/software-mansion/react-native-screens#readme","license":"MIT"},"react-native-svg":{"version":"13.9.0","url":"https://github.com/react-native-community/react-native-svg","license":"MIT"},"react-native-web":{"version":"0.19.9","url":"git://github.com/necolas/react-native-web.git","license":"MIT"},"react-native-webview":{"version":"13.2.2","url":"https://github.com/react-native-webview/react-native-webview#readme","license":"MIT"},"react-virtuoso":{"version":"4.6.2","url":"https://virtuoso.dev/","license":"MIT"},"sharp-cli":{"version":"2.1.0","url":"https://github.com/vseventer/sharp-cli","license":"MIT"},"tippy.js":{"version":"6.3.7","url":"https://atomiks.github.io/tippyjs/","license":"MIT"},"websql":{"version":"2.0.3","url":"git://github.com/nolanlawson/node-websql.git","license":"Apache-2.0"},"xlsx":{"version":"0.18.5","url":"https://sheetjs.com/","license":"Apache-2.0"}};
|