Files
fastapi-admin/front/api/resources.js
2020-04-06 18:21:35 +08:00

191 lines
4.7 KiB
JavaScript

const _ = require("lodash");
// also you can use other locales
const faker = require("faker/locale/en");
const inflection = require("inflection");
String.prototype.slugify = function() {
return inflection.dasherize(this.toLowerCase());
};
const config = require("./config");
// Categories
const categories = {
data: [],
fields: {
[config.primaryKey]: { label: "ID" },
parent_id: {
label: "Parent",
ref: "parent.name",
type: "tree",
options: [],
cols: 4
},
slug: { cols: 4, searchable: true },
name: { cols: 4 },
created_at: { label: "Created At", type: "datetime", sortable: true },
_actions: {
preview: {
label: "Custom Preview",
// use lodash.template with { item: `current row data` }
to: "/rest/categories/<%= item._id %>",
variant: "warning"
},
edit: true,
delete: true
}
}
};
_.times(15, i => {
const name = inflection.titleize(faker.commerce.department());
categories.data.push({
[config.primaryKey]: `c${genId(i)}`,
parent_id: null,
slug: name.slugify(),
name: name,
created_at: faker.date.recent()
});
});
categories.data = categories.data.map((v, i) => {
if (i < 3) {
return v;
}
const parent = _.sample(categories.data);
if (!parent || parent[config.primaryKey] == v[config.primaryKey]) {
// return v
}
v.parent_id = parent[config.primaryKey];
v.parent = _.clone(parent);
return v;
});
function findChildren(
data = [],
id = null,
primaryKey = config.primaryKey,
foreignKey = "parent_id",
labelKey = "name"
) {
const ret = _.filter(data, v => v[foreignKey] == id).map(v => {
const children = findChildren(data, v[primaryKey]);
if (!_.isEmpty(children)) {
v.children = _.clone(children);
}
v.value = v[primaryKey];
v.text = v[labelKey];
return v;
});
return ret;
}
categories.fields.parent_id.options = findChildren(categories.data);
// Users
const users = {
data: [],
fields: {
[config.primaryKey]: { label: "ID" },
username: { label: "Username", cols: 4, searchable: true },
password: { listable: false, cols: 4 },
mobile: { listable: false, cols: 4 },
avatar: { type: "image", cols: 6 },
intro: { type: "textarea", cols: 6, listable: false },
created_at: { label: "Created At", type: "datetime" }
}
};
_.times(128, i =>
users.data.push({
[config.primaryKey]: `a${genId(i)}`,
username: faker.name.lastName(),
password: "admin",
mobile: faker.phone.phoneNumber(),
avatar: faker.image.image(120, 120),
intro: faker.lorem.sentences(),
created_at: faker.date.recent()
})
);
// Products
const products = {
data: [],
fields: {
[config.primaryKey]: {},
category_ids: {
cols: 3,
label: "Categories",
multiple: true,
ref: "categories.name",
type: "tree",
options: findChildren(categories.data),
sortable: true
},
// slug: { cols: 3, searchable: true },
name: {
cols: 6,
searchable: true,
description: "Give me an awesome title."
},
views: { type: "number", cols: 3, listable: false },
sort: { type: "number", cols: 3, sortable: true },
is_reviewed: { type: "switch", cols: 3 },
type: {
type: "radiolist",
cols: 3,
options: [
{ text: "Article", value: "article" },
{ text: "Page", value: "page" }
],
searchable: true,
description: "Which type do you like?"
},
image: {
type: "image",
cols: 6,
limit: { width: 320, height: 180, limit: 300 * 1000 }
},
body: { type: "html", listable: false, cols: 6 },
created_at: { label: "Created At", type: "datetime" }
}
};
_.times(78, i => {
const cats = _.sampleSize(categories.data, parseInt(Math.random() * 3));
const name = faker.commerce.productName();
products.data.push({
[config.primaryKey]: `b${genId(i)}`,
category_ids: cats.map(v => v[config.primaryKey]),
categories: cats,
name: name,
slug: name.slugify(),
// image: faker.image.imageUrl(),
image: faker.image.image(320, 180),
body: faker.lorem.paragraphs(),
is_reviewed: Math.random() > 0.2,
views: parseInt(Math.random() * 1000),
sort: parseInt(Math.random() * 200),
type: _.sample(products.fields.type.options).value,
created_at: faker.date.recent()
});
});
function genId(salt) {
return Number(new Date(2020, 1, 1).getTime() + salt).toString(16);
}
function buildOptions(
data = [],
valueField = config.primaryKey,
titleField = "title"
) {
// { text: 'Please choose...' }
return data.map(v => {
return { text: v[titleField], value: v[valueField] };
});
}
module.exports = { users, products, categories, genId };