mirror of
https://github.com/frappe/books.git
synced 2025-01-22 14:48:25 +00:00
getRootLabel for AccountTree
This commit is contained in:
parent
64c1b4d4ba
commit
f310fd671e
@ -88,6 +88,10 @@ module.exports = {
|
||||
},
|
||||
|
||||
treeSettings: {
|
||||
parentField: 'parentAccount'
|
||||
parentField: 'parentAccount',
|
||||
async getRootLabel() {
|
||||
let accountingSettings = await frappe.getSingle('AccountingSettings');
|
||||
return accountingSettings.companyName;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
626
www/dist/js/bundle.js
vendored
626
www/dist/js/bundle.js
vendored
@ -4575,7 +4575,7 @@ if (typeof undefined === 'function' && undefined.amd) {
|
||||
}
|
||||
}).call(commonjsGlobal);
|
||||
|
||||
|
||||
//# sourceMappingURL=showdown.js.map
|
||||
});
|
||||
|
||||
var moment = createCommonjsModule(function (module, exports) {
|
||||
@ -9321,7 +9321,14 @@ var format = {
|
||||
value = markdown.makeHtml(value || '');
|
||||
|
||||
} else if (field.fieldtype === 'Date') {
|
||||
value = moment(value).format(frappejs.SystemSettings.dateFormat.toUpperCase());
|
||||
let dateFormat;
|
||||
if (!frappejs.SystemSettings) {
|
||||
dateFormat = 'yyyy-mm-dd';
|
||||
} else {
|
||||
dateFormat = frappejs.SystemSettings.dateFormat;
|
||||
}
|
||||
|
||||
value = moment(value).format(dateFormat.toUpperCase());
|
||||
|
||||
} else {
|
||||
if (value===null || value===undefined) {
|
||||
@ -23068,7 +23075,7 @@ Popper.placements = placements;
|
||||
Popper.Defaults = Defaults;
|
||||
|
||||
|
||||
|
||||
//# sourceMappingURL=popper.js.map
|
||||
|
||||
|
||||
var popper = Object.freeze({
|
||||
@ -26967,7 +26974,7 @@ exports.Tooltip = Tooltip;
|
||||
Object.defineProperty(exports, '__esModule', { value: true });
|
||||
|
||||
})));
|
||||
|
||||
//# sourceMappingURL=bootstrap.js.map
|
||||
});
|
||||
|
||||
unwrapExports(bootstrap);
|
||||
@ -27025,12 +27032,13 @@ var dropdown = Dropdown;
|
||||
|
||||
var ui = {
|
||||
create(tag, obj) {
|
||||
if(!obj) {
|
||||
if(tag.includes('<')) {
|
||||
let div = document.createElement('div');
|
||||
div.innerHTML = tag.trim();
|
||||
return div.firstChild;
|
||||
}
|
||||
let element = document.createElement(tag);
|
||||
obj = obj || {};
|
||||
|
||||
let $ = (expr, con) => {
|
||||
return typeof expr === "string"
|
||||
@ -27757,6 +27765,50 @@ var list = class BaseList extends observable {
|
||||
}
|
||||
};
|
||||
|
||||
let templates = {};
|
||||
|
||||
class BaseComponent extends HTMLElement {
|
||||
constructor(name) {
|
||||
super();
|
||||
|
||||
this._name = name;
|
||||
this._shadowRoot = this.attachShadow({ mode: 'open' });
|
||||
|
||||
if (!templates[name]) {
|
||||
makeTemplate(name, this.templateHTML);
|
||||
}
|
||||
|
||||
let template = getTemplate(name);
|
||||
this._shadowRoot.appendChild(template);
|
||||
}
|
||||
|
||||
triggerEvent(eventName, detail = {}) {
|
||||
const event = new CustomEvent(eventName, {
|
||||
bubbles: true,
|
||||
composed: true,
|
||||
detail
|
||||
});
|
||||
this.dispatchEvent(event);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function makeTemplate(name, html) {
|
||||
if (!templates[name]) {
|
||||
let template = document.createElement('template');
|
||||
template.id = name;
|
||||
template.innerHTML = html;
|
||||
|
||||
templates[name] = template;
|
||||
}
|
||||
}
|
||||
|
||||
function getTemplate(name) {
|
||||
return templates[name].content.cloneNode(true);
|
||||
}
|
||||
|
||||
var baseComponent = BaseComponent;
|
||||
|
||||
var alert$1 = {"name":"alert","figma":{"id":"0:5","file":"FP7lqd1V00LUaT5zvdklkkZr"},"keywords":["warning","triangle","exclamation","point"],"width":16,"height":16,"path":"<path fill-rule=\"evenodd\" d=\"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z\"/>"};
|
||||
var beaker = {"name":"beaker","figma":{"id":"0:26","file":"FP7lqd1V00LUaT5zvdklkkZr"},"keywords":["experiment","labs","experimental","feature","test","science","education","study","development","testing"],"width":16,"height":16,"path":"<path fill-rule=\"evenodd\" d=\"M14.84 14.59L11.46 7V3h1V2h-9v1h1v4l-3.37 7.59A1 1 0 0 0 2 16h11.94c.72 0 1.2-.75.91-1.41h-.01zM4.21 10l1.25-3V3h5v4l1.25 3h-7.5zm4.25-2h1v1h-1V8zm-1-1h-1V6h1v1zm0-3h1v1h-1V4zm0-3h-1V0h1v1z\"/>"};
|
||||
var bell = {"name":"bell","figma":{"id":"0:34","file":"FP7lqd1V00LUaT5zvdklkkZr"},"keywords":["notification"],"width":14,"height":16,"path":"<path fill-rule=\"evenodd\" d=\"M14 12v1H0v-1l.73-.58c.77-.77.81-2.55 1.19-4.42C2.69 3.23 6 2 6 2c0-.55.45-1 1-1s1 .45 1 1c0 0 3.39 1.23 4.16 5 .38 1.88.42 3.66 1.19 4.42l.66.58H14zm-7 4c1.11 0 2-.89 2-2H5c0 1.11.89 2 2 2z\"/>"};
|
||||
@ -28140,7 +28192,6 @@ object-assign
|
||||
@license MIT
|
||||
*/
|
||||
|
||||
/* eslint-disable no-unused-vars */
|
||||
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
|
||||
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
||||
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
|
||||
@ -28287,152 +28338,57 @@ Object.keys(data$2).forEach(function(key) {
|
||||
// Import data into exports
|
||||
var octicons = data$2;
|
||||
|
||||
var utils$3 = {
|
||||
convertFieldsToDatatableColumns(fields, layout = 'fixed') {
|
||||
return fields.map(field => {
|
||||
if (!field.width) {
|
||||
if (layout==='ratio') {
|
||||
field.width = 1;
|
||||
} else if (layout==='fixed') {
|
||||
field.width = 120;
|
||||
}
|
||||
}
|
||||
return {
|
||||
id: field.fieldname || frappejs.slug(field.label),
|
||||
field: field,
|
||||
content: field.label,
|
||||
editable: true,
|
||||
sortable: false,
|
||||
resizable: true,
|
||||
dropdown: false,
|
||||
width: field.width,
|
||||
align: ['Int', 'Float', 'Currency'].includes(field.fieldtype) ? 'right' : 'left',
|
||||
format: (value) => frappejs.format(value, field)
|
||||
}
|
||||
});
|
||||
var treeNode = "<!-- styles -->\n<style>\n :host {\n display: block;\n }\n\n .tree-node {\n display: flex;\n align-items: center;\n }\n\n .tree-node:hover {\n background-color: gray;\n background-color: var(--tree-node-hover);\n cursor: pointer;\n }\n\n .tree-node:hover .tree-node-actions {\n display: block;\n }\n\n .tree-node-content {\n display: flex;\n align-items: center;\n }\n\n .tree-node-actions {\n display: none;\n margin-left: 2rem;\n }\n\n .tree-node-icon {\n width: 2rem;\n height: 2rem;\n }\n\n .tree-node-icon svg {\n padding: 0.5rem;\n }\n\n .tree-node-children {\n padding-left: 2rem;\n }\n</style>\n\n<!-- template -->\n<div class=\"tree-node\">\n <div class=\"tree-node-content\">\n <div class=\"tree-node-icon\"></div>\n <div class=\"tree-node-label\"></div>\n </div>\n <div class=\"tree-node-actions\">\n <slot name=\"actions\"></slot>\n </div>\n</div>\n<div class=\"tree-node-children\">\n <slot></slot>\n</div>";
|
||||
|
||||
},
|
||||
var treeNode$1 = Object.freeze({
|
||||
default: treeNode
|
||||
});
|
||||
|
||||
addButton(label, parent, action, unhide = true) {
|
||||
const link = frappejs.ui.add('button', 'btn btn-sm btn-outline-secondary', parent, label);
|
||||
link.type = 'button';
|
||||
link.addEventListener('click', action);
|
||||
if (unhide) {
|
||||
parent.classList.remove('hide');
|
||||
}
|
||||
return link;
|
||||
},
|
||||
|
||||
// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/
|
||||
forEachNode(nodeList, callback, scope) {
|
||||
if(!nodeList) return;
|
||||
for (var i = 0; i < nodeList.length; i++) {
|
||||
callback.call(scope, nodeList[i], i);
|
||||
}
|
||||
},
|
||||
|
||||
activate($parent, $child, commonSelector, activeClass='active', index = -1) {
|
||||
let $children = $parent.querySelectorAll(`${commonSelector}.${activeClass}`);
|
||||
|
||||
if (typeof $child === 'string') {
|
||||
$child = $parent.querySelector($child);
|
||||
}
|
||||
|
||||
this.forEachNode($children, (node, i) => {
|
||||
if(index >= 0 && i <= index) return;
|
||||
node.classList.remove(activeClass);
|
||||
});
|
||||
|
||||
$child.classList.add(activeClass);
|
||||
}
|
||||
};
|
||||
var require$$0$1 = ( treeNode$1 && treeNode ) || treeNode$1;
|
||||
|
||||
const iconSet = {
|
||||
open: octicons["triangle-down"].toSVG({ width: "12", height: "12", "class": "tree-icon-open" }),
|
||||
close: octicons["triangle-right"].toSVG({ width: "12", height: "12", "class": "tree-icon-closed" })
|
||||
};
|
||||
|
||||
let TreeTemplate = document.createElement('template');
|
||||
TreeTemplate.innerHTML = `
|
||||
<style>
|
||||
:host {
|
||||
display: block;
|
||||
}
|
||||
</style>
|
||||
<div class="tree">
|
||||
<slot></slot>
|
||||
</div>
|
||||
`;
|
||||
|
||||
class Tree extends HTMLElement {
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.attachShadow({ mode: 'open' })
|
||||
.appendChild(TreeTemplate.content.cloneNode(true));
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('f-tree', Tree);
|
||||
|
||||
let TreeNodeTemplate = document.createElement('template');
|
||||
TreeNodeTemplate.innerHTML = `
|
||||
<style>
|
||||
:host {
|
||||
display: block;
|
||||
}
|
||||
|
||||
:host:hover {
|
||||
background-color: gray;
|
||||
background-color: var(--tree-node-hover);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.tree-node-content {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.tree-node-icon {
|
||||
width: 2rem;
|
||||
height: 2rem;
|
||||
}
|
||||
|
||||
.tree-node-icon svg {
|
||||
padding: 0.5rem;
|
||||
}
|
||||
|
||||
.tree-node-children {
|
||||
padding-left: 2rem;
|
||||
}
|
||||
</style>
|
||||
<div class="tree-node-content">
|
||||
<div class="tree-node-icon"></div>
|
||||
<div class="tree-node-label"></div>
|
||||
<div class="tree-node-actions"></div>
|
||||
</div>
|
||||
<slot class="tree-node-children"></slot>
|
||||
`;
|
||||
|
||||
|
||||
class TreeNode extends HTMLElement {
|
||||
class TreeNode extends baseComponent {
|
||||
static get observedAttributes() {
|
||||
return ['label', 'expanded']
|
||||
return ['label', 'expanded'];
|
||||
}
|
||||
|
||||
get templateHTML() {
|
||||
return require$$0$1;
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
super('TreeNode');
|
||||
|
||||
let shadowRoot = this.attachShadow({ mode: 'open' });
|
||||
shadowRoot.appendChild(TreeNodeTemplate.content.cloneNode(true));
|
||||
let shadowRoot = this._shadowRoot;
|
||||
this.iconEl = shadowRoot.querySelector('.tree-node-icon');
|
||||
this.labelEl = shadowRoot.querySelector('.tree-node-label');
|
||||
this.actionsEl = shadowRoot.querySelector('.tree-node-actions');
|
||||
this.childrenEl = shadowRoot.querySelector('.tree-node-children');
|
||||
|
||||
this.addEventListener('click', e => {
|
||||
e.stopImmediatePropagation();
|
||||
|
||||
if (e.target.matches('[slot="actions"]')) {
|
||||
this.triggerEvent('tree-node-action', {
|
||||
actionEl: e.target
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.expanded) {
|
||||
this.removeAttribute('expanded');
|
||||
} else {
|
||||
this.setAttribute('expanded', '');
|
||||
}
|
||||
});
|
||||
this.onExpand();
|
||||
}
|
||||
|
||||
attributeChangedCallback(name, oldValue, newValue) {
|
||||
console.log(name, oldValue, newValue);
|
||||
|
||||
switch(name) {
|
||||
case 'label': {
|
||||
this.labelEl.innerHTML = newValue || '';
|
||||
@ -28440,26 +28396,67 @@ class TreeNode extends HTMLElement {
|
||||
}
|
||||
|
||||
case 'expanded': {
|
||||
this.expanded = this.hasAttribute('expanded');
|
||||
|
||||
if (this.expanded) {
|
||||
this.iconEl.innerHTML = iconSet.open;
|
||||
} else {
|
||||
this.iconEl.innerHTML = iconSet.close;
|
||||
}
|
||||
const isExpanded = this.hasAttribute('expanded');
|
||||
this.onExpand(isExpanded);
|
||||
break;
|
||||
}
|
||||
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
onExpand(isExpanded = false) {
|
||||
if (this.isLeaf) return;
|
||||
|
||||
if (isExpanded) {
|
||||
this.iconEl.innerHTML = iconSet.open;
|
||||
this.childrenEl.style.display = '';
|
||||
} else {
|
||||
this.iconEl.innerHTML = iconSet.close;
|
||||
this.childrenEl.style.display = 'none';
|
||||
}
|
||||
|
||||
this.triggerEvent('tree-node-expand', {
|
||||
expanded: isExpanded
|
||||
});
|
||||
}
|
||||
|
||||
get isRoot() {
|
||||
return this.hasAttribute('is-root');
|
||||
}
|
||||
|
||||
get expanded() {
|
||||
return this.hasAttribute('expanded');
|
||||
}
|
||||
|
||||
get isLeaf() {
|
||||
return this.hasAttribute('is-leaf');
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('f-tree-node', TreeNode);
|
||||
|
||||
// const keyboard = require('frappejs/client/ui/keyboard');
|
||||
var index = "<!-- styles -->\n<style>\n :host {\n display: block;\n }\n</style>\n\n<!-- template -->\n<div class=\"tree\">\n <slot></slot>\n</div>\n";
|
||||
|
||||
var tree$2 = class BaseTree extends list {
|
||||
var tree = Object.freeze({
|
||||
default: index
|
||||
});
|
||||
|
||||
var require$$0$2 = ( tree && index ) || tree;
|
||||
|
||||
class Tree extends baseComponent {
|
||||
get templateHTML() {
|
||||
return require$$0$2;
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super('Tree');
|
||||
}
|
||||
}
|
||||
|
||||
window.customElements.define('f-tree', Tree);
|
||||
|
||||
var tree$3 = class BaseTree extends list {
|
||||
|
||||
init() {
|
||||
this.meta = frappejs.getMeta(this.doctype);
|
||||
@ -28494,8 +28491,9 @@ var tree$2 = class BaseTree extends list {
|
||||
this.body.innerHTML = '';
|
||||
this.dirty = false;
|
||||
|
||||
let accountingSettings = await frappejs.db.getSingle('AccountingSettings');
|
||||
let rootLabel = accountingSettings.companyName;
|
||||
const rootLabel = this.treeSettings.getRootLabel ?
|
||||
await this.treeSettings.getRootLabel() :
|
||||
this.doctype;
|
||||
|
||||
this.renderTree(rootLabel);
|
||||
this.trigger('state-change');
|
||||
@ -28512,74 +28510,62 @@ var tree$2 = class BaseTree extends list {
|
||||
}
|
||||
|
||||
renderTree(rootLabel) {
|
||||
// const tree = new Tree();
|
||||
// tree.getChildNodes = async node => {
|
||||
// const children = await this.getData(node) || [];
|
||||
// return children.map(d => ({
|
||||
// label: d.name,
|
||||
// value: d.name,
|
||||
// expandable: d.isGroup
|
||||
// }));
|
||||
// }
|
||||
// tree.rootNode = {
|
||||
// label: rootLabel,
|
||||
// value: rootLabel,
|
||||
// isRoot: 1,
|
||||
// expandable: 1
|
||||
// }
|
||||
// this.body.appendChild(tree);
|
||||
|
||||
this.rootNode = {
|
||||
label: rootLabel,
|
||||
value: rootLabel,
|
||||
isRoot: true,
|
||||
expanded: true,
|
||||
children: []
|
||||
isGroup: true,
|
||||
children: null
|
||||
};
|
||||
|
||||
this.treeWrapper = frappejs.ui.create(`
|
||||
<f-tree>
|
||||
<f-tree-node label="TennisMart" expanded>
|
||||
<f-tree-node label="Expense" expanded>
|
||||
<f-tree-node label="Direct Expense" expanded>
|
||||
</f-tree-node>
|
||||
</f-tree-node>
|
||||
</f-tree-node>
|
||||
${this.getTreeNodeHTML(this.rootNode)}
|
||||
</f-tree>
|
||||
`);
|
||||
|
||||
const rootNode = this.treeWrapper.querySelector('f-tree-node[is-root]');
|
||||
rootNode.props = this.rootNode;
|
||||
|
||||
this.body.appendChild(this.treeWrapper);
|
||||
|
||||
frappejs.ui.on(this.treeWrapper, 'click', 'f-tree-node', async (e, treeNode) => {
|
||||
if (treeNode.expanded) {
|
||||
treeNode.removeAttribute('expanded');
|
||||
} else {
|
||||
treeNode.setAttribute('expanded', '');
|
||||
frappejs.ui.on(this.treeWrapper, 'tree-node-expand', 'f-tree-node', async (e, treeNode) => {
|
||||
if (!treeNode.expanded) return;
|
||||
|
||||
if (!treeNode.props.children) {
|
||||
const data = await this.getData(treeNode.props);
|
||||
const children = data.map(d => ({
|
||||
label: d.name,
|
||||
value: d.name,
|
||||
isGroup: d.isGroup,
|
||||
doc: d
|
||||
}));
|
||||
treeNode.props.children = children;
|
||||
|
||||
for (let child of children) {
|
||||
const childNode = frappejs.ui.create(this.getTreeNodeHTML(child));
|
||||
childNode.props = child;
|
||||
treeNode.appendChild(childNode);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// if (treeNode.hasAttribute('is-root')) {
|
||||
// node = this.rootNode;
|
||||
// } else {
|
||||
|
||||
// }
|
||||
|
||||
|
||||
});
|
||||
|
||||
frappejs.ui.on(this.treeWrapper, 'tree-node-action', 'f-tree-node', (e, treeNode) => {
|
||||
if (treeNode.isRoot) return;
|
||||
|
||||
// this.tree = new Tree({
|
||||
// label: rootLabel,
|
||||
// parent: this.body,
|
||||
// method: async node => {
|
||||
// const children = await this.getData(node) || [];
|
||||
// return children.map(d => ({
|
||||
// label: d.name,
|
||||
// value: d.name,
|
||||
// expandable: d.isGroup
|
||||
// }));
|
||||
// }
|
||||
// });
|
||||
const button = e.detail.actionEl;
|
||||
const action = button.getAttribute('data-action');
|
||||
|
||||
if (action === 'edit') {
|
||||
this.edit(treeNode.props.doc.name);
|
||||
}
|
||||
});
|
||||
|
||||
rootNode.click(); // open the root node
|
||||
}
|
||||
|
||||
edit(name) {
|
||||
frappejs.desk.showFormModal(this.doctype, name);
|
||||
}
|
||||
|
||||
async getData(node) {
|
||||
@ -28601,65 +28587,38 @@ var tree$2 = class BaseTree extends list {
|
||||
});
|
||||
}
|
||||
|
||||
getTreeNodeHTML(node) {
|
||||
return (
|
||||
`<f-tree-node
|
||||
label="${node.label}"
|
||||
value="${node.value}"
|
||||
${node.expanded ? 'expanded' : ''}
|
||||
${node.isRoot ? 'is-root' : ''}
|
||||
${node.isGroup ? '' : 'is-leaf'}
|
||||
>
|
||||
${this.getActionButtonsHTML()}
|
||||
</f-tree-node>`
|
||||
);
|
||||
}
|
||||
|
||||
getActionButtonsHTML() {
|
||||
return [
|
||||
{ id: 'edit', label: frappejs._('Edit') }
|
||||
// { id: 'addChild', label: frappe._('Add Child') },
|
||||
// { id: 'delete', label: frappe._('Delete') },
|
||||
].map(button => {
|
||||
return `<button class="btn btn-link btn-sm m-0" slot="actions" data-action="${button.id}">
|
||||
${button.label}
|
||||
</button>`;
|
||||
})
|
||||
.join('');
|
||||
}
|
||||
|
||||
getFields() {
|
||||
let fields = [this.treeSettings.parentField, 'isGroup'];
|
||||
this.updateStandardFields(fields);
|
||||
return fields;
|
||||
}
|
||||
|
||||
makeToolbar() {
|
||||
this.makeSearch();
|
||||
|
||||
this.btnNew = this.page.addButton(frappejs._('New'), 'btn-primary', async () => {
|
||||
await frappejs.router.setRoute('new', this.doctype);
|
||||
});
|
||||
|
||||
this.btnDelete = this.page.addButton(frappejs._('Delete'), 'btn-secondary hide', async () => {
|
||||
await frappejs.db.deleteMany(this.doctype, this.getCheckedRowNames());
|
||||
await this.refresh();
|
||||
});
|
||||
|
||||
this.btnReport = this.page.addButton(frappejs._('Report'), 'btn-outline-secondary hide', async () => {
|
||||
await frappejs.router.setRoute('table', this.doctype);
|
||||
});
|
||||
|
||||
this.on('state-change', () => {
|
||||
const checkedCount = this.getCheckedRowNames().length;
|
||||
this.btnDelete.classList.toggle('hide', checkedCount ? false : true);
|
||||
this.btnNew.classList.toggle('hide', checkedCount ? true : false);
|
||||
this.btnReport.classList.toggle('hide', checkedCount ? true : false);
|
||||
});
|
||||
|
||||
this.page.body.addEventListener('click', (event) => {
|
||||
if (event.target.classList.contains('checkbox')) {
|
||||
this.trigger('state-change');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
makeSearch() {
|
||||
this.toolbar = frappejs.ui.add('div', 'list-toolbar', this.parent);
|
||||
this.toolbar.innerHTML = `
|
||||
<div class="input-group list-search">
|
||||
<input class="form-control" type="text" placeholder="Search...">
|
||||
<div class="input-group-append">
|
||||
<button class="btn btn-outline-secondary btn-search">Search</button>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
this.searchInput = this.toolbar.querySelector('input');
|
||||
this.searchInput.addEventListener('keypress', (event) => {
|
||||
if (event.keyCode === 13) {
|
||||
this.refresh();
|
||||
}
|
||||
});
|
||||
|
||||
this.btnSearch = this.toolbar.querySelector('.btn-search');
|
||||
this.btnSearch.addEventListener('click', (event) => {
|
||||
this.refresh();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
class BaseControl {
|
||||
@ -41341,11 +41300,6 @@ var htmlmixed = createCommonjsModule(function (module, exports) {
|
||||
});
|
||||
});
|
||||
|
||||
// const frappe = require('frappejs');
|
||||
|
||||
// eslint-disable-line
|
||||
// eslint-disable-line
|
||||
|
||||
class CodeControl extends base {
|
||||
makeInput() {
|
||||
if (!this.options) {
|
||||
@ -49241,9 +49195,6 @@ DataTable.__version__ = packageJson.version;
|
||||
module.exports = DataTable;
|
||||
});
|
||||
|
||||
// eslint-disable-line
|
||||
|
||||
|
||||
var modal = class Modal extends observable {
|
||||
constructor({ title, body, primary, secondary }) {
|
||||
super();
|
||||
@ -49320,6 +49271,66 @@ var modal = class Modal extends observable {
|
||||
}
|
||||
};
|
||||
|
||||
var utils$3 = {
|
||||
convertFieldsToDatatableColumns(fields, layout = 'fixed') {
|
||||
return fields.map(field => {
|
||||
if (!field.width) {
|
||||
if (layout==='ratio') {
|
||||
field.width = 1;
|
||||
} else if (layout==='fixed') {
|
||||
field.width = 120;
|
||||
}
|
||||
}
|
||||
return {
|
||||
id: field.fieldname || frappejs.slug(field.label),
|
||||
field: field,
|
||||
content: field.label,
|
||||
editable: true,
|
||||
sortable: false,
|
||||
resizable: true,
|
||||
dropdown: false,
|
||||
width: field.width,
|
||||
align: ['Int', 'Float', 'Currency'].includes(field.fieldtype) ? 'right' : 'left',
|
||||
format: (value) => frappejs.format(value, field)
|
||||
}
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
addButton(label, parent, action, unhide = true) {
|
||||
const link = frappejs.ui.add('button', 'btn btn-sm btn-outline-secondary', parent, label);
|
||||
link.type = 'button';
|
||||
link.addEventListener('click', action);
|
||||
if (unhide) {
|
||||
parent.classList.remove('hide');
|
||||
}
|
||||
return link;
|
||||
},
|
||||
|
||||
// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/
|
||||
forEachNode(nodeList, callback, scope) {
|
||||
if(!nodeList) return;
|
||||
for (var i = 0; i < nodeList.length; i++) {
|
||||
callback.call(scope, nodeList[i], i);
|
||||
}
|
||||
},
|
||||
|
||||
activate($parent, $child, commonSelector, activeClass='active', index = -1) {
|
||||
let $children = $parent.querySelectorAll(`${commonSelector}.${activeClass}`);
|
||||
|
||||
if (typeof $child === 'string') {
|
||||
$child = $parent.querySelector($child);
|
||||
}
|
||||
|
||||
this.forEachNode($children, (node, i) => {
|
||||
if(index >= 0 && i <= index) return;
|
||||
node.classList.remove(activeClass);
|
||||
});
|
||||
|
||||
$child.classList.add(activeClass);
|
||||
}
|
||||
};
|
||||
|
||||
var modelTable = class ModelTable {
|
||||
constructor({doctype, parent, layout, parentControl, getRowData,
|
||||
isDisabled, getTableData}) {
|
||||
@ -50010,7 +50021,7 @@ var view = {
|
||||
return (frappejs.views['List'] && frappejs.views['List'][doctype]) || list;
|
||||
},
|
||||
getTreeClass(doctype) {
|
||||
return (frappejs.views['Tree'] && frappejs.views['Tree'][doctype] || tree$2);
|
||||
return (frappejs.views['Tree'] && frappejs.views['Tree'][doctype] || tree$3);
|
||||
}
|
||||
};
|
||||
|
||||
@ -57850,11 +57861,41 @@ module.exports = installCompat;
|
||||
/***/ })
|
||||
/******/ ]);
|
||||
});
|
||||
|
||||
//# sourceMappingURL=nunjucks.js.map
|
||||
});
|
||||
|
||||
unwrapExports(nunjucks);
|
||||
|
||||
async function getHTML(doctype, name) {
|
||||
const meta = frappejs.getMeta(doctype);
|
||||
const printFormat = await frappejs.getDoc('PrintFormat', meta.print.printFormat);
|
||||
let doc = await frappejs.getDoc(doctype, name);
|
||||
let context = {doc: doc, frappe: frappejs};
|
||||
|
||||
console.log(context);
|
||||
|
||||
let html;
|
||||
try {
|
||||
html = nunjucks.renderString(printFormat.template, context);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
html = '';
|
||||
}
|
||||
|
||||
return `
|
||||
<div class="print-page">
|
||||
${html}
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
var print = {
|
||||
getHTML
|
||||
};
|
||||
|
||||
const { getHTML: getHTML$1 } = print;
|
||||
|
||||
|
||||
nunjucks.configure({ autoescape: false });
|
||||
|
||||
var printpage = class PrintPage extends page {
|
||||
@ -57868,6 +57909,10 @@ var printpage = class PrintPage extends page {
|
||||
this.addButton(frappejs._('Edit'), 'primary', () => {
|
||||
frappejs.router.setRoute('edit', this.doctype, this.name);
|
||||
});
|
||||
|
||||
this.addButton(frappejs._('PDF'), 'secondary', async () => {
|
||||
frappejs.getPDF(this.doctype, this.name);
|
||||
});
|
||||
}
|
||||
|
||||
async show(params) {
|
||||
@ -57882,14 +57927,11 @@ var printpage = class PrintPage extends page {
|
||||
}
|
||||
|
||||
async renderTemplate() {
|
||||
this.printFormat = await frappejs.getDoc('PrintFormat', this.meta.print.printFormat);
|
||||
let doc = await frappejs.getDoc(this.doctype, this.name);
|
||||
let context = {doc: doc, frappe: frappejs};
|
||||
|
||||
frappejs.desk.setActiveDoc(doc);
|
||||
|
||||
const html = await getHTML$1(this.doctype, this.name);
|
||||
try {
|
||||
this.body.innerHTML = `<div class="print-page">${nunjucks.renderString(this.printFormat.template, context)}</div>`;
|
||||
this.body.innerHTML = html;
|
||||
// this.setTitle(doc.name);
|
||||
} catch (e) {
|
||||
this.renderError('Template Error', e);
|
||||
@ -58051,10 +58093,6 @@ var menu = class DeskMenu {
|
||||
}
|
||||
};
|
||||
|
||||
// const Search = require('./search');
|
||||
|
||||
|
||||
|
||||
const views = {};
|
||||
views.Form = formpage;
|
||||
views.List = listpage;
|
||||
@ -58232,6 +58270,37 @@ var desk = class Desk {
|
||||
}
|
||||
};
|
||||
|
||||
async function getPDF(doctype, name) {
|
||||
const headers = {
|
||||
'Accept': 'application/pdf',
|
||||
'Content-Type': 'application/json'
|
||||
};
|
||||
|
||||
const res = await fetch('/api/method/pdf', {
|
||||
method: 'POST',
|
||||
headers,
|
||||
body: JSON.stringify({ doctype, name })
|
||||
});
|
||||
|
||||
const blob = await res.blob();
|
||||
showFile(blob);
|
||||
}
|
||||
|
||||
|
||||
function showFile(blob, filename='file.pdf') {
|
||||
const newBlob = new Blob([blob], { type: "application/pdf" });
|
||||
const data = window.URL.createObjectURL(newBlob);
|
||||
const link = document.createElement('a');
|
||||
link.href = data;
|
||||
link.download = filename;
|
||||
link.click();
|
||||
setTimeout(() => window.URL.revokeObjectURL(data), 100);
|
||||
}
|
||||
|
||||
var pdf = {
|
||||
getPDF
|
||||
};
|
||||
|
||||
var FilterItem = {
|
||||
name: "FilterItem",
|
||||
doctype: "DocType",
|
||||
@ -58755,6 +58824,7 @@ var models = {
|
||||
frappejs.ui = ui;
|
||||
|
||||
|
||||
const { getPDF: getPDF$1 } = pdf;
|
||||
|
||||
var client = {
|
||||
async start({server, columns = 2, makeDesk = 1}) {
|
||||
@ -58798,13 +58868,11 @@ var client = {
|
||||
|
||||
return await response.json();
|
||||
};
|
||||
|
||||
frappejs.getPDF = getPDF$1;
|
||||
}
|
||||
};
|
||||
|
||||
// baseclass for report
|
||||
// `url` url for report
|
||||
// `getColumns` return columns
|
||||
|
||||
var reportpage = class ReportPage extends page {
|
||||
constructor({title, filterFields}) {
|
||||
super({title: title, hasRoute: true});
|
||||
@ -59019,7 +59087,11 @@ module.exports = {
|
||||
},
|
||||
|
||||
treeSettings: {
|
||||
parentField: 'parentAccount'
|
||||
parentField: 'parentAccount',
|
||||
async getRootLabel() {
|
||||
let accountingSettings = await frappe.getSingle('AccountingSettings');
|
||||
return accountingSettings.companyName;
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
@ -59624,9 +59696,9 @@ var countryInfo$1 = Object.freeze({
|
||||
default: countryInfo
|
||||
});
|
||||
|
||||
var require$$0$10 = ( countryInfo$1 && countryInfo ) || countryInfo$1;
|
||||
var require$$0$13 = ( countryInfo$1 && countryInfo ) || countryInfo$1;
|
||||
|
||||
const countryList = Object.keys(require$$0$10).sort();
|
||||
const countryList = Object.keys(require$$0$13).sort();
|
||||
|
||||
var AccountingSettings = {
|
||||
name: "AccountingSettings",
|
||||
@ -60691,9 +60763,8 @@ var client$2 = {
|
||||
}
|
||||
};
|
||||
|
||||
const countryList$1 = Object.keys(require$$0$10).sort();
|
||||
const countryList$1 = Object.keys(require$$0$13).sort();
|
||||
|
||||
// start server
|
||||
client.start({
|
||||
server: 'localhost:8000',
|
||||
makeDesk: 0
|
||||
@ -60715,3 +60786,4 @@ var www = false;
|
||||
return www;
|
||||
|
||||
}());
|
||||
//# sourceMappingURL=bundle.js.map
|
||||
|
92
yarn.lock
92
yarn.lock
@ -713,6 +713,13 @@ callsites@^0.2.0:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
|
||||
|
||||
camel-case@3.0.x:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
|
||||
dependencies:
|
||||
no-case "^2.2.0"
|
||||
upper-case "^1.1.1"
|
||||
|
||||
camelcase-css@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-1.0.1.tgz#157c4238265f5cf94a1dffde86446552cbf3f705"
|
||||
@ -860,6 +867,12 @@ class-utils@^0.3.5:
|
||||
isobject "^3.0.0"
|
||||
static-extend "^0.1.1"
|
||||
|
||||
clean-css@4.1.x:
|
||||
version "4.1.11"
|
||||
resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a"
|
||||
dependencies:
|
||||
source-map "0.5.x"
|
||||
|
||||
cli-boxes@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
|
||||
@ -973,6 +986,10 @@ commander@2.11.0:
|
||||
version "2.11.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
|
||||
|
||||
commander@2.15.x, commander@~2.15.0:
|
||||
version "2.15.1"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
|
||||
|
||||
commander@^2.13.0:
|
||||
version "2.14.1"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa"
|
||||
@ -1710,6 +1727,10 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
|
||||
|
||||
estree-walker@^0.2.1:
|
||||
version "0.2.1"
|
||||
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e"
|
||||
|
||||
estree-walker@^0.3.0:
|
||||
version "0.3.1"
|
||||
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa"
|
||||
@ -2038,6 +2059,7 @@ frappejs@../frappejs:
|
||||
frappe-datatable frappe/datatable
|
||||
frappejs "../frappejs"
|
||||
jquery "^3.3.1"
|
||||
mkdirp "^0.5.1"
|
||||
mocha "^4.1.0"
|
||||
moment "^2.20.1"
|
||||
mysql "^2.15.0"
|
||||
@ -2051,6 +2073,7 @@ frappejs@../frappejs:
|
||||
puppeteer "^1.2.0"
|
||||
rollup "^0.55.1"
|
||||
rollup-plugin-commonjs "^8.3.0"
|
||||
rollup-plugin-html "^0.2.1"
|
||||
rollup-plugin-json "^2.3.0"
|
||||
rollup-plugin-node-resolve "^3.0.2"
|
||||
rollup-plugin-postcss "^1.2.7"
|
||||
@ -2440,7 +2463,7 @@ hawk@~6.0.2:
|
||||
hoek "4.x.x"
|
||||
sntp "2.x.x"
|
||||
|
||||
he@1.1.1:
|
||||
he@1.1.1, he@1.1.x:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
|
||||
|
||||
@ -2468,6 +2491,18 @@ html-comment-regex@^1.1.0:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
|
||||
|
||||
html-minifier@^3.0.2:
|
||||
version "3.5.14"
|
||||
resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.14.tgz#88653b24b344274e3e3d7052f1541ebea054ac60"
|
||||
dependencies:
|
||||
camel-case "3.0.x"
|
||||
clean-css "4.1.x"
|
||||
commander "2.15.x"
|
||||
he "1.1.x"
|
||||
param-case "2.1.x"
|
||||
relateurl "0.2.x"
|
||||
uglify-js "3.3.x"
|
||||
|
||||
http-errors@1.6.2, http-errors@~1.6.2:
|
||||
version "1.6.2"
|
||||
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
|
||||
@ -3101,6 +3136,10 @@ loud-rejection@^1.0.0:
|
||||
currently-unhandled "^0.4.1"
|
||||
signal-exit "^3.0.0"
|
||||
|
||||
lower-case@^1.1.1:
|
||||
version "1.1.4"
|
||||
resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
|
||||
|
||||
lowercase-keys@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
|
||||
@ -3366,6 +3405,12 @@ negotiator@0.6.1:
|
||||
version "0.6.1"
|
||||
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
|
||||
|
||||
no-case@^2.2.0:
|
||||
version "2.3.2"
|
||||
resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
|
||||
dependencies:
|
||||
lower-case "^1.1.1"
|
||||
|
||||
node-fetch@^1.7.3:
|
||||
version "1.7.3"
|
||||
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
|
||||
@ -3681,6 +3726,12 @@ package-json@^4.0.0:
|
||||
registry-url "^3.0.3"
|
||||
semver "^5.1.0"
|
||||
|
||||
param-case@2.1.x:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
|
||||
dependencies:
|
||||
no-case "^2.2.0"
|
||||
|
||||
parse-author@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/parse-author/-/parse-author-2.0.0.tgz#d3460bf1ddd0dfaeed42da754242e65fb684a81f"
|
||||
@ -4607,6 +4658,10 @@ regjsparser@^0.1.4:
|
||||
dependencies:
|
||||
jsesc "~0.5.0"
|
||||
|
||||
relateurl@0.2.x:
|
||||
version "0.2.7"
|
||||
resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
|
||||
|
||||
remove-trailing-separator@^1.0.1:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
|
||||
@ -4795,6 +4850,13 @@ rollup-plugin-commonjs@^8.3.0:
|
||||
resolve "^1.4.0"
|
||||
rollup-pluginutils "^2.0.1"
|
||||
|
||||
rollup-plugin-html@^0.2.1:
|
||||
version "0.2.1"
|
||||
resolved "https://registry.yarnpkg.com/rollup-plugin-html/-/rollup-plugin-html-0.2.1.tgz#a1862eca87ae54b677689d0d4133911e8226463d"
|
||||
dependencies:
|
||||
html-minifier "^3.0.2"
|
||||
rollup-pluginutils "^1.5.0"
|
||||
|
||||
rollup-plugin-json@^2.3.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/rollup-plugin-json/-/rollup-plugin-json-2.3.0.tgz#3c07a452c1b5391be28006fbfff3644056ce0add"
|
||||
@ -4850,6 +4912,13 @@ rollup-plugin-sass@^0.5.3:
|
||||
estree-walker "^0.3.0"
|
||||
micromatch "^2.3.11"
|
||||
|
||||
rollup-pluginutils@^1.5.0:
|
||||
version "1.5.2"
|
||||
resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408"
|
||||
dependencies:
|
||||
estree-walker "^0.2.1"
|
||||
minimatch "^3.0.2"
|
||||
|
||||
rollup@^0.55.1:
|
||||
version "0.55.1"
|
||||
resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.55.1.tgz#baf4f23abe3014b29e56dea7d72d9946e56ac7dd"
|
||||
@ -5127,17 +5196,17 @@ source-map-url@^0.4.0:
|
||||
version "0.4.0"
|
||||
resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
|
||||
|
||||
source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6:
|
||||
version "0.5.7"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
|
||||
|
||||
source-map@^0.4.2:
|
||||
version "0.4.4"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
|
||||
dependencies:
|
||||
amdefine ">=0.0.4"
|
||||
|
||||
source-map@^0.5.3, source-map@^0.5.6:
|
||||
version "0.5.7"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
|
||||
|
||||
source-map@^0.6.0, source-map@^0.6.1:
|
||||
source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
|
||||
version "0.6.1"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
||||
|
||||
@ -5565,6 +5634,13 @@ typedarray@^0.0.6:
|
||||
version "0.0.6"
|
||||
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
|
||||
|
||||
uglify-js@3.3.x:
|
||||
version "3.3.21"
|
||||
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.21.tgz#851a34cbb31840ecb881968ed07dd3a61e7264a0"
|
||||
dependencies:
|
||||
commander "~2.15.0"
|
||||
source-map "~0.6.1"
|
||||
|
||||
uid-number@^0.0.6:
|
||||
version "0.0.6"
|
||||
resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
|
||||
@ -5656,6 +5732,10 @@ update-notifier@^2.4.0:
|
||||
semver-diff "^2.0.0"
|
||||
xdg-basedir "^3.0.0"
|
||||
|
||||
upper-case@^1.1.1:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
|
||||
|
||||
uri-js@^3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-3.0.2.tgz#f90b858507f81dea4dcfbb3c4c3dbfa2b557faaa"
|
||||
|
Loading…
x
Reference in New Issue
Block a user