@360works/fmpromise
Version:
A modern JS toolkit for FileMaker Web Viewers, including a dev server and type generation.
45 lines (44 loc) • 8.7 kB
JavaScript
import fmPromise from '@360works/fmpromise';
// fetch records using a query with optional parameters
let recordsByQuery = await fmPromise.executeFileMakerDataAPIRecords({ action: 'read', layouts: 'User', limit: 123, query: [{ firstName: 'sam' }], offset: 1, portal: ['one'], sort: [{ fieldName: 'name', sortOrder: 'descend' }], version: 'v2' });
// minimal request will fetch everything from a layout
let recordsByQueryMinimal = await fmPromise.executeFileMakerDataAPIRecords({ action: 'read', layouts: 'User', query: [{ projectId: 'POJ003' }] });
// minimal request will fetch everything from a layout
let recordsByQueryMinimalTyped = await fmPromise.executeFileMakerDataAPIRecords({ action: 'read', layouts: 'User', query: [{ projectId: 'POJ003' }] });
// fetch records using non-deprecated method and convert to records
let recordNonDeprecated = (await fmPromise.dataRead({ action: 'read', layouts: 'User', query: [{ projectId: 'POJ003' }] })).toRecords();
// I should be allowed to type the `toRecords()` to my User interface without Typescript complaining
let tasksTyped = (await fmPromise.dataRead({ action: 'read', layouts: 'User', query: [{ projectId: 'POJ003' }] })).toRecords();
// fetch records using a recordId with optional parameters
let recordsByRecordId = await fmPromise.executeFileMakerDataAPIRecords({ action: 'read', layouts: 'User', limit: 123, recordId: 123, offset: 1, portal: ['one'], sort: [{ fieldName: 'name', sortOrder: 'descend' }], version: 'v2' });
// fetch records using a recordId, minimal required fields
let recordsByRecordIdMinimal = await fmPromise.executeFileMakerDataAPIRecords({ action: 'read', layouts: 'User', recordId: 123, });
// fetch records using both recordId and query, not allowed. FIX! would be nice to show an error here. No biggie.
let recordsByRecordInvalid = await fmPromise.executeFileMakerDataAPIRecords({ action: 'read', layouts: 'User', recordId: 123, query: [{ projectId: 'POJ003' }] });
// executeFileMakerDataAPIRecords should fail for any action besides "read"
// await fmPromise.executeFileMakerDataAPIRecords({action:'metaData', layouts:''});
// fetch metadata for all layouts
await fmPromise.executeFileMakerDataAPI({ action: 'metaData', layouts: '' });
// sample response for all layouts:
// {"response": {"layouts": [{"name": "User","table": "User"},{"name": "Person","table": "Person"},{"name": "JoinUserUserDetails","table": "JoinUserUser"},{"name": "Drag and Drop","table": "User"},{"name": "fmPromiseModule","table": "fmPromiseModule"},{"name": "fmPromiseWebViewer","table": "fmPromiseWebViewer"},{"name": "slider","table": "User"}]},"messages": [{"code": "0","message": "OK"}]}
// fetch metadata for a specific layout
await fmPromise.executeFileMakerDataAPI({ action: 'metaData', layouts: 'UserDetail' });
// sample layout-level metadata response:
// {"response":{"fieldMetaData":[{"name":"title","type":"normal","displayType":"editText","result":"text","global":false,"autoEnter":false,"fourDigitYear":false,"maxRepeat":1,"maxCharacters":0,"notEmpty":true,"numeric":false,"timeOfDay":false,"repetitionStart":1,"repetitionEnd":1},{"name":"sortOrder","type":"normal","displayType":"editText","result":"number","global":false,"autoEnter":true,"fourDigitYear":false,"maxRepeat":1,"maxCharacters":0,"notEmpty":false,"numeric":true,"timeOfDay":false,"repetitionStart":1,"repetitionEnd":1},{"name":"dueDate","type":"normal","displayType":"editText","result":"date","global":false,"autoEnter":false,"fourDigitYear":false,"maxRepeat":1,"maxCharacters":0,"notEmpty":false,"numeric":false,"timeOfDay":false,"repetitionStart":1,"repetitionEnd":1},{"name":"difficulty","type":"normal","displayType":"popupMenu","result":"number","global":false,"autoEnter":true,"fourDigitYear":false,"maxRepeat":1,"maxCharacters":0,"notEmpty":false,"numeric":false,"timeOfDay":false,"valueList":"difficulty","repetitionStart":1,"repetitionEnd":1},{"name":"id","type":"normal","displayType":"editText","result":"text","global":false,"autoEnter":true,"fourDigitYear":false,"maxRepeat":1,"maxCharacters":0,"notEmpty":true,"numeric":false,"timeOfDay":false,"repetitionStart":1,"repetitionEnd":1}],"portalMetaData":{"T_JoinUserUser_User":[{"name":"T_JoinUserUser_User::userId","type":"normal","displayType":"editText","result":"text","global":false,"autoEnter":false,"fourDigitYear":false,"maxRepeat":1,"maxCharacters":0,"notEmpty":false,"numeric":false,"timeOfDay":false,"repetitionStart":1,"repetitionEnd":1}],"User":[{"name":"title","type":"normal","displayType":"editText","result":"text","global":false,"autoEnter":false,"fourDigitYear":false,"maxRepeat":1,"maxCharacters":0,"notEmpty":true,"numeric":false,"timeOfDay":false,"repetitionStart":1,"repetitionEnd":1}]},"valueLists":[{"name":"difficulty","type":"customList","values":[{"displayValue":"1","value":"1"},{"displayValue":"2","value":"2"},{"displayValue":"3","value":"3"},{"displayValue":"4","value":"4"},{"displayValue":"5","value":"5"}]}],"table":"User"},"messages":[{"code":"0","message":"OK"}]}
// fetch metadata for a base table, returns all fields for a table. This is the only time `layouts` can be omitted
let metaUserTable = await fmPromise.executeFileMakerDataAPI({ action: 'metaData', tables: 'User' });
// sample table-level metadata response:
// {"response": {"fieldMetaData": [{"name": "id","type": "normal","result": "text","global": false,"autoEnter": true,"fourDigitYear": false,"maxRepeat": 1,"maxCharacters": 0,"notEmpty": true,"numeric": false,"timeOfDay": false,"repetitionStart": 1,"repetitionEnd": 1},{"name": "createdTimestamp","type": "normal","result": "timeStamp","global": false,"autoEnter": true,"fourDigitYear": true,"maxRepeat": 1,"maxCharacters": 0,"notEmpty": true,"numeric": false,"timeOfDay": false,"repetitionStart": 1,"repetitionEnd": 1},{"name": "createdBy","type": "normal","result": "text","global": false,"autoEnter": true,"fourDigitYear": false,"maxRepeat": 1,"maxCharacters": 0,"notEmpty": true,"numeric": false,"timeOfDay": false,"repetitionStart": 1,"repetitionEnd": 1},{"name": "_modifiedTrigger","type": "normal","result": "timeStamp","global": false,"autoEnter": true,"fourDigitYear": true,"maxRepeat": 1,"maxCharacters": 0,"notEmpty": true,"numeric": false,"timeOfDay": false,"repetitionStart": 1,"repetitionEnd": 1},{"name": "modifiedTimestamp","type": "normal","result": "timeStamp","global": false,"autoEnter": true,"fourDigitYear": false,"maxRepeat": 1,"maxCharacters": 0,"notEmpty": true,"numeric": false,"timeOfDay": false,"repetitionStart": 1,"repetitionEnd": 1},{"name": "modifiedBy","type": "normal","result": "text","global": false,"autoEnter": true,"fourDigitYear": false,"maxRepeat": 1,"maxCharacters": 0,"notEmpty": true,"numeric": false,"timeOfDay": false,"repetitionStart": 1,"repetitionEnd": 1},{"name": "title","type": "normal","result": "text","global": false,"autoEnter": false,"fourDigitYear": false,"maxRepeat": 1,"maxCharacters": 0,"notEmpty": true,"numeric": false,"timeOfDay": false,"repetitionStart": 1,"repetitionEnd": 1},{"name": "sortOrder","type": "normal","result": "number","global": false,"autoEnter": true,"fourDigitYear": false,"maxRepeat": 1,"maxCharacters": 0,"notEmpty": false,"numeric": true,"timeOfDay": false,"repetitionStart": 1,"repetitionEnd": 1},{"name": "dueDate","type": "normal","result": "date","global": false,"autoEnter": false,"fourDigitYear": false,"maxRepeat": 1,"maxCharacters": 0,"notEmpty": false,"numeric": false,"timeOfDay": false,"repetitionStart": 1,"repetitionEnd": 1},{"name": "difficulty","type": "normal","result": "number","global": false,"autoEnter": true,"fourDigitYear": false,"maxRepeat": 1,"maxCharacters": 0,"notEmpty": false,"numeric": false,"timeOfDay": false,"repetitionStart": 1,"repetitionEnd": 1}],"portalMetaData": {},"baseTable": "User"},"messages": [{"code": "0","message": "OK"}]}
// sample metadata response
// modifications
// creating a new record: don't provide a modId or recordId
let created = await fmPromise.executeFileMakerDataAPI({ action: 'create', layouts: 'User', fieldData: { name: 'bob' }, version: 'v2' });
// updating: must provide a recordId, optional modId
let updated = await fmPromise.executeFileMakerDataAPI({ action: 'update', layouts: 'User', fieldData: { name: 'bob' }, recordId: 123, modId: 123, version: 'v2' });
// minimal required params for an update operation
let updatedMinimal = await fmPromise.executeFileMakerDataAPI({ action: 'update', layouts: 'User', fieldData: { name: 'bob' }, recordId: 123 });
// delete response will be mostly empty
let deleted = await fmPromise.executeFileMakerDataAPI({ action: 'delete', layouts: 'User', recordId: 123, modId: 123, version: 'v2' });
let first = recordsByQuery[0];
first.modId;
first.recordId;