UNPKG

@fto-consult/common

Version:

Un ensemble de bibliothèques et d'utilistaires communs pour le développement d'applications javascript

156 lines (145 loc) 6.59 kB
// Copyright 2022 @fto-consult/Boris Fouomene. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. import FormData from "$ecomponents/Form/FormData"; import {getFormData as getData} from "$ecomponents/Form/utils/FormsManager"; import {defaultObj,defaultStr,isNonNullString,isObj,uniqid} from "$cutils"; import {open,close} from "$ecomponents/Dialog/Provider"; import { COPY_ICON } from '$ecomponents/Icon'; import notify from "$active-platform/notify"; import {copyTextToClipboard} from "./utils"; import {isMobileOrTabletMedia} from "$cplatform/dimensions"; import session from "$session"; import ScrollView from "$ecomponents/ScrollView"; export * from "./utils"; export const copyToClipboard = (str) => { if(typeof str =='number' || typeof str =='boolean'){ str +=""; } if(isNonNullString(str)){ return copyTextToClipboard(str); } else { return selectText2Copy(str); } }; const clipboardFormName = uniqid("clip-board-formname"); let sessionKeyName = sessionName => "cplipboard-copy-"+defaultStr(sessionName); export const selectText2Copy = (args)=>{ let {data,fields,sessionName,rowData} = args; sessionName = defaultStr(sessionName,'copy-to-clipboard').trim(); if(isObj(fields)){ data = defaultObj(data,rowData); let formData = {},sessionKey = sessionKeyName(sessionName); if(sessionName){ formData = defaultObj(session.get(sessionKey)); } let keyFields = {} let fieldsCounter = 0; Object.map(data,(v,i)=>{ if(!isObj(fields[i])) return null; let field = fields[i]; if(isDecimal(v)){ v = field.format =="money"? v.formatMoney() : v.formatNumber(); } if(isNonNullString(v)){ let labelText = defaultStr(field.text,field.label); fieldsCounter++; keyFields[i] = { label : labelText+("="+v),//"["+v+"]", labelText, defaultValue : v, code : i } } }); if(fieldsCounter > 0){ let formFields = {}; formFields.content = { text :'Eléments à copier', type : 'select', multiple : true, required : true, items : keyFields, itemValue : ({item})=>item.code, renderText : ({item})=>item.label, } formFields.renderType = { text : "Copier : ", type : "select", multiple : false, defaultValue : "label+value", required : true, items : [ {code:'label+value',label:"Libelé+valeur"}, {code:'value',label:'Valeur uniquement'}, {code:'label',label:'Libelé uniquement'} ] } formFields.separator = { text : "Séparateur des valeurs", defaultValue : "ligne", title : 'Ce séparateur est utilisé pour séparer les valeurs/libelés lorsque plusieurs éléments sont sélectionnés.\nSi vous souhaitez utiliser le séparateur retour chariot (nouvelle ligne), veuillez tout simplement entrez un texte contenant [ligne].' } return new Promise ((resolve,reject)=>{ return open({ dismissable : true, propsMutator : (rest)=>{ if(isMobileOrTabletMedia()){ rest.maxActions = 1; } else { rest.maxActions = 2; } return rest; }, title : "Sélectionnez les éléments à copier", onDismiss : (e)=>{ reject({msg : 'Annulé par l\'utilisateur'}); }, actions : [{ icon : COPY_ICON, text : 'Copier', primary : true, onPress : (e)=>{ const data = getData(clipboardFormName); if(isObj(data) && isArray(data.content) && data.content.length){ data.separator = defaultStr(data.separator,"\n").replaceAll("ligne","\n"); let content = data.content.map(v=>{ switch(data.renderType){ case "label+value" : return keyFields[v].label; case "label" : return keyFields[v].labelText; case "value": return keyFields[v].defaultValue } return keyFields[v].label }).join(data.separator); if(isNonNullString(content) && copyToClipboard(content)){ session.set(sessionKey,{renderType:data.renderType}) } resolve(data); close(); } else { notify.warning("Aucun élément sélectionné") } } }, ], responsive : true, children : <> <ScrollView> <FormData formName = {clipboardFormName} data = {formData} fields = {formFields} responsive = {false} /> </ScrollView> </> }) }) } } return Promise.reject({msg:'champs non définis, impossible de copier l\'objet dans le presse papier'}); } export default copyToClipboard;