장기미접속회원 page 추가

This commit is contained in:
이담 정 2022-07-07 12:19:24 +00:00
parent 0aa7a47aca
commit 9d042a73bf
16 changed files with 1923 additions and 0 deletions

View File

@ -157,6 +157,13 @@ export const appRoutes: Route[] = [
'app/modules/admin/member/casinomoney/casinomoney.module' 'app/modules/admin/member/casinomoney/casinomoney.module'
).then((m: any) => m.CasinomoneyModule), ).then((m: any) => m.CasinomoneyModule),
}, },
{
path: 'unconnected',
loadChildren: () =>
import(
'app/modules/admin/member/unconnected/unconnected.module'
).then((m: any) => m.UnconnectedModule),
},
], ],
}, },
{ {

View File

@ -0,0 +1,217 @@
import { Injectable } from '@angular/core';
import { assign, cloneDeep } from 'lodash-es';
import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api';
import { unconnecteds as unconnectedsData } from './data';
@Injectable({
providedIn: 'root',
})
export class MemberUnconnectedMockApi {
private _unconnecteds: any[] = unconnectedsData;
/**
* Constructor
*/
constructor(private _fuseMockApiService: FuseMockApiService) {
// Register Mock API handlers
this.registerHandlers();
}
// -----------------------------------------------------------------------------------------------------
// @ Public methods
// -----------------------------------------------------------------------------------------------------
/**
* Register Mock API handlers
*/
registerHandlers(): void {
// -----------------------------------------------------------------------------------------------------
// @ Unconnecteds - GET
// -----------------------------------------------------------------------------------------------------
this._fuseMockApiService
.onGet('api/apps/member/unconnected/unconnecteds', 300)
.reply(({ request }) => {
// Get available queries
const search = request.params.get('search');
const sort = request.params.get('sort') || 'name';
const order = request.params.get('order') || 'asc';
const page = parseInt(request.params.get('page') ?? '1', 10);
const size = parseInt(request.params.get('size') ?? '10', 10);
// Clone the unconnecteds
let unconnecteds: any[] | null = cloneDeep(this._unconnecteds);
// Sort the unconnecteds
if (sort === 'sku' || sort === 'name' || sort === 'active') {
unconnecteds.sort((a, b) => {
const fieldA = a[sort].toString().toUpperCase();
const fieldB = b[sort].toString().toUpperCase();
return order === 'asc'
? fieldA.localeCompare(fieldB)
: fieldB.localeCompare(fieldA);
});
} else {
unconnecteds.sort((a, b) =>
order === 'asc' ? a[sort] - b[sort] : b[sort] - a[sort]
);
}
// If search exists...
if (search) {
// Filter the unconnecteds
unconnecteds = unconnecteds.filter(
(contact: any) =>
contact.name &&
contact.name.toLowerCase().includes(search.toLowerCase())
);
}
// Paginate - Start
const unconnectedsLength = unconnecteds.length;
// Calculate pagination details
const begin = page * size;
const end = Math.min(size * (page + 1), unconnectedsLength);
const lastPage = Math.max(Math.ceil(unconnectedsLength / size), 1);
// Prepare the pagination object
let pagination = {};
// If the requested page number is bigger than
// the last possible page number, return null for
// unconnecteds but also send the last possible page so
// the app can navigate to there
if (page > lastPage) {
unconnecteds = null;
pagination = {
lastPage,
};
} else {
// Paginate the results by size
unconnecteds = unconnecteds.slice(begin, end);
// Prepare the pagination mock-api
pagination = {
length: unconnectedsLength,
size: size,
page: page,
lastPage: lastPage,
startIndex: begin,
endIndex: end - 1,
};
}
// Return the response
return [
200,
{
unconnecteds,
pagination,
},
];
});
// -----------------------------------------------------------------------------------------------------
// @ Unconnected - GET
// -----------------------------------------------------------------------------------------------------
this._fuseMockApiService
.onGet('api/apps/member/unconnected/unconnected')
.reply(({ request }) => {
// Get the id from the params
const id = request.params.get('id');
// Clone the unconnecteds
const unconnecteds = cloneDeep(this._unconnecteds);
// Find the unconnected
const unconnected = unconnecteds.find((item: any) => item.id === id);
// Return the response
return [200, unconnected];
});
// -----------------------------------------------------------------------------------------------------
// @ Unconnected - POST
// -----------------------------------------------------------------------------------------------------
this._fuseMockApiService
.onPost('api/apps/member/unconnected/unconnected')
.reply(() => {
// Generate a new unconnected
const newUnconnected = {
id: FuseMockApiUtils.guid(),
category: '',
name: 'A New User',
description: '',
tags: [],
sku: '',
barcode: '',
brand: '',
vendor: '',
stock: '',
reserved: '',
cost: '',
basePrice: '',
taxPercent: '',
price: '',
weight: '',
thumbnail: '',
images: [],
active: false,
};
// Unshift the new unconnected
this._unconnecteds.unshift(newUnconnected);
// Return the response
return [200, newUnconnected];
});
// -----------------------------------------------------------------------------------------------------
// @ Unconnected - PATCH
// -----------------------------------------------------------------------------------------------------
this._fuseMockApiService
.onPatch('api/apps/member/unconnected/unconnected')
.reply(({ request }) => {
// Get the id and unconnected
const id = request.body.id;
const unconnected = cloneDeep(request.body.unconnected);
// Prepare the updated unconnected
let updatedUnconnected = null;
// Find the unconnected and update it
this._unconnecteds.forEach((item, index, unconnecteds) => {
if (item.id === id) {
// Update the unconnected
unconnecteds[index] = assign({}, unconnecteds[index], unconnected);
// Store the updated unconnected
updatedUnconnected = unconnecteds[index];
}
});
// Return the response
return [200, updatedUnconnected];
});
// -----------------------------------------------------------------------------------------------------
// @ Unconnected - DELETE
// -----------------------------------------------------------------------------------------------------
this._fuseMockApiService
.onDelete('api/apps/member/unconnected/unconnected')
.reply(({ request }) => {
// Get the id
const id = request.params.get('id');
// Find the unconnected and delete it
this._unconnecteds.forEach((item, index) => {
if (item.id === id) {
this._unconnecteds.splice(index, 1);
}
});
// Return the response
return [200, true];
});
}
}

View File

@ -0,0 +1,776 @@
/* eslint-disable */
export const unconnecteds = [
{
id: '7eb7c859-1347-4317-96b6-9476a7e2ba3c',
category: 'b899ec30-b85a-40ab-bb1f-18a596d5c6de',
name: 'Capmia Mens Chronograph Watch 44mm 5 ATM',
description:
'Consequat esse in culpa commodo anim. Et ullamco anim amet est. Sunt dolore ex occaecat officia anim. In sit minim laborum nostrud. Consequat ex do velit voluptate do exercitation est adipisicing quis velit.',
tags: [
'167190fa-51b4-45fc-a742-8ce1b33d24ea',
'7d6dd47e-7472-4f8b-93d4-46c114c44533',
'8837b93f-388b-43cc-851d-4ca8f23f3a61',
'2300ac48-f268-466a-b765-8b878b6e14a7',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'ETV-2425',
barcode: '8346201275534',
brand: '61d52c2a-8947-4a2c-8c35-f36baef45b96',
vendor: '998b0c07-abfd-4ba3-8de1-7563ef3c4d57',
stock: 30,
reserved: 5,
cost: 450.18,
basePrice: 1036,
taxPercent: 30,
price: 1346.8,
weight: 0.61,
thumbnail: 'assets/images/apps/ecommerce/products/watch-01-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-01-01.jpg',
'assets/images/apps/ecommerce/products/watch-01-02.jpg',
'assets/images/apps/ecommerce/products/watch-01-03.jpg',
],
active: true,
},
{
id: '00b0292f-3d50-4669-a0c4-7a9d85efc98d',
category: '07986d93-d4eb-4de1-9448-2538407f7254',
name: 'Zeon Ladies Chronograph Watch 40mm 10 ATM',
description:
'Nulla duis dolor fugiat culpa proident. Duis anim est excepteur occaecat adipisicing occaecat. Labore id laborum non elit proident est veniam officia eu. Labore aliqua nisi duis sint ex consequat nostrud excepteur duis ex incididunt adipisicing.',
tags: [
'3baea410-a7d6-4916-b79a-bdce50c37f95',
'7d6dd47e-7472-4f8b-93d4-46c114c44533',
'8f868ddb-d4a2-461d-bc3b-d7c8668687c3',
'0b11b742-3125-4d75-9a6f-84af7fde1969',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'ATH-7573',
barcode: '8278968055700',
brand: '2c4d98d8-f334-4125-9596-862515f5526b',
vendor: '05ebb527-d733-46a9-acfb-a4e4ec960024',
stock: 37,
reserved: 2,
cost: 723.55,
basePrice: 1686,
taxPercent: 30,
price: 2191.8,
weight: 0.79,
thumbnail: 'assets/images/apps/ecommerce/products/watch-02-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-02-01.jpg',
'assets/images/apps/ecommerce/products/watch-02-02.jpg',
'assets/images/apps/ecommerce/products/watch-02-03.jpg',
],
active: true,
},
{
id: 'on04',
category: 'b899ec30-b85a-40ab-bb1f-18a596d5c6de',
name: 'Benton Mens Automatic Watch 44mm 5 ATM',
description:
'Velit irure deserunt aliqua officia. Eiusmod quis sunt magna laboris aliquip non dolor consequat cupidatat dolore esse. Consectetur mollit officia laborum fugiat nulla duis ad excepteur do aliqua fugiat. Fugiat non laboris exercitation ipsum in incididunt.',
tags: [
'167190fa-51b4-45fc-a742-8ce1b33d24ea',
'0fc39efd-f640-41f8-95a5-3f1d749df200',
'8837b93f-388b-43cc-851d-4ca8f23f3a61',
'2300ac48-f268-466a-b765-8b878b6e14a7',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'ADH-1921',
barcode: '8808746892183',
brand: 'e1789f32-9475-43e7-9256-451d2e3a2282',
vendor: '987dd10a-43b1-49f9-bfd9-05bb2dbc7029',
stock: 30,
reserved: 3,
cost: 390.63,
basePrice: 950,
taxPercent: 10,
price: 1045,
weight: 0.76,
thumbnail: null,
images: [
'assets/images/apps/ecommerce/products/watch-03-01.jpg',
'assets/images/apps/ecommerce/products/watch-03-02.jpg',
'assets/images/apps/ecommerce/products/watch-03-03.jpg',
],
active: false,
highRank: '[매장]on04',
rank: '회원',
level: 1,
nickname: '가가가',
accountHolder: '44',
contact: '010-4444-4444',
cash: 0,
comp: 1649,
coupon: 0,
gameMoney: 0,
todayComp: 0,
deposit: 0,
withdraw: 0,
margin: 0,
accession: '2022-06-12 15:42',
final: '',
ip: '',
},
{
id: '8fcce528-d878-4cc8-99f7-bd3451ed5405',
category: 'b899ec30-b85a-40ab-bb1f-18a596d5c6de',
name: 'Capmia Mens Chronograph Watch 44mm 10 ATM',
description:
'Velit nisi proident cupidatat exercitation occaecat et adipisicing nostrud id ex nostrud sint. Qui fugiat velit minim amet reprehenderit voluptate velit exercitation proident Lorem nisi culpa. Commodo quis officia officia eiusmod mollit aute fugiat duis quis minim culpa in. Exercitation laborum fugiat ex excepteur officia reprehenderit magna ipsum. Laboris dolore nostrud id labore sint consectetur aliqua tempor ea aute do.',
tags: [
'167190fa-51b4-45fc-a742-8ce1b33d24ea',
'7d6dd47e-7472-4f8b-93d4-46c114c44533',
'8837b93f-388b-43cc-851d-4ca8f23f3a61',
'0b11b742-3125-4d75-9a6f-84af7fde1969',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'EAP-7752',
barcode: '8866355574164',
brand: '61d52c2a-8947-4a2c-8c35-f36baef45b96',
vendor: '987dd10a-43b1-49f9-bfd9-05bb2dbc7029',
stock: 37,
reserved: 4,
cost: 395.37,
basePrice: 839,
taxPercent: 30,
price: 1090.7,
weight: 0.62,
thumbnail: 'assets/images/apps/ecommerce/products/watch-04-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-04-01.jpg',
'assets/images/apps/ecommerce/products/watch-04-02.jpg',
'assets/images/apps/ecommerce/products/watch-04-03.jpg',
],
active: true,
},
{
id: 'onon6',
category: '07986d93-d4eb-4de1-9448-2538407f7254',
name: 'Benton Ladies Automatic Watch 40mm 5 ATM',
description:
'Pariatur proident labore commodo consequat qui et. Ad labore fugiat consectetur ea magna dolore mollit consequat reprehenderit laborum ad mollit eiusmod. Esse laboris voluptate ullamco occaecat labore esse laboris enim ipsum aliquip ipsum. Ea ea proident eu enim anim mollit non consequat enim nulla.',
tags: [
'3baea410-a7d6-4916-b79a-bdce50c37f95',
'0fc39efd-f640-41f8-95a5-3f1d749df200',
'8f868ddb-d4a2-461d-bc3b-d7c8668687c3',
'2300ac48-f268-466a-b765-8b878b6e14a7',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'ADP-5745',
barcode: '8390590339828',
brand: 'e1789f32-9475-43e7-9256-451d2e3a2282',
vendor: '05ebb527-d733-46a9-acfb-a4e4ec960024',
stock: 12,
reserved: 3,
cost: 442.61,
basePrice: 961,
taxPercent: 20,
price: 1153.2,
weight: 0.67,
thumbnail: 'assets/images/apps/ecommerce/products/watch-05-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-05-01.jpg',
'assets/images/apps/ecommerce/products/watch-05-02.jpg',
'assets/images/apps/ecommerce/products/watch-05-03.jpg',
],
active: false,
highRank: '[총판]on03',
rank: '매장',
level: 1,
nickname: '가가가',
accountHolder: '가가가',
contact: '1111',
cash: 0,
comp: 0,
coupon: 0,
gameMoney: 0,
todayComp: 0,
deposit: 200000,
withdraw: 0,
margin: 200000,
accession: '2022-06-12 16:02',
final: '2022-06-20 15:41',
ip: '175.198.74.36',
},
{
id: 'd7a47d7c-4cdf-4319-bbaa-37ade38c622c',
category: 'b899ec30-b85a-40ab-bb1f-18a596d5c6de',
name: 'Benton Mens Chronograph Watch 44mm 10 ATM',
description:
'Nulla enim reprehenderit proident ut Lorem laborum cillum eiusmod est ex anim. Nisi non non laboris excepteur ullamco elit do duis anim esse labore aliqua adipisicing velit. Deserunt magna exercitation cillum amet.',
tags: [
'167190fa-51b4-45fc-a742-8ce1b33d24ea',
'7d6dd47e-7472-4f8b-93d4-46c114c44533',
'8837b93f-388b-43cc-851d-4ca8f23f3a61',
'0b11b742-3125-4d75-9a6f-84af7fde1969',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'ATV-2569',
barcode: '8238990048137',
brand: 'e1789f32-9475-43e7-9256-451d2e3a2282',
vendor: '987dd10a-43b1-49f9-bfd9-05bb2dbc7029',
stock: 36,
reserved: 2,
cost: 563.43,
basePrice: 1370,
taxPercent: 30,
price: 1781,
weight: 0.62,
thumbnail: 'assets/images/apps/ecommerce/products/watch-06-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-06-01.jpg',
'assets/images/apps/ecommerce/products/watch-06-02.jpg',
'assets/images/apps/ecommerce/products/watch-06-03.jpg',
],
active: true,
},
{
id: 'ecf0b3df-38c3-45dc-972b-c509a3dc053e',
category: 'b899ec30-b85a-40ab-bb1f-18a596d5c6de',
name: 'Benton Mens Chronograph Watch 44mm 10 ATM',
description:
'Esse culpa ut ullamco dolore quis adipisicing. Minim veniam quis magna officia non. In pariatur nostrud nisi eiusmod minim anim id. Commodo ex incididunt dolor ad id aliqua incididunt minim in Lorem reprehenderit. Commodo ullamco consectetur aliqua Lorem cupidatat esse veniam consectetur sint veniam duis commodo.',
tags: [
'167190fa-51b4-45fc-a742-8ce1b33d24ea',
'7d6dd47e-7472-4f8b-93d4-46c114c44533',
'8837b93f-388b-43cc-851d-4ca8f23f3a61',
'0b11b742-3125-4d75-9a6f-84af7fde1969',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'EAH-2563',
barcode: '8638426908385',
brand: 'e1789f32-9475-43e7-9256-451d2e3a2282',
vendor: '987dd10a-43b1-49f9-bfd9-05bb2dbc7029',
stock: 35,
reserved: 5,
cost: 705.26,
basePrice: 1721,
taxPercent: 20,
price: 2065.2,
weight: 0.67,
thumbnail: 'assets/images/apps/ecommerce/products/watch-07-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-07-01.jpg',
'assets/images/apps/ecommerce/products/watch-07-02.jpg',
'assets/images/apps/ecommerce/products/watch-07-03.jpg',
],
active: false,
},
{
id: '5765080a-aaee-40b9-86be-c18b9d79c73c',
category: 'ad12aa94-3863-47f8-acab-a638ef02a3e9',
name: 'Benton Unisex Automatic Watch 40mm 10 ATM',
description:
'Anim duis nisi ut ex amet reprehenderit cillum consequat pariatur ipsum elit voluptate excepteur non. Anim enim proident laboris pariatur mollit quis incididunt labore. Incididunt tempor aliquip ex labore ad consequat cillum est sunt anim dolor. Dolore adipisicing non nulla cillum Lorem deserunt. Nostrud incididunt amet sint velit.',
tags: [
'8ec8f60d-552f-4216-9f11-462b95b1d306',
'0fc39efd-f640-41f8-95a5-3f1d749df200',
'8f868ddb-d4a2-461d-bc3b-d7c8668687c3',
'0b11b742-3125-4d75-9a6f-84af7fde1969',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'ATH-6399',
barcode: '8881883828441',
brand: 'e1789f32-9475-43e7-9256-451d2e3a2282',
vendor: '05ebb527-d733-46a9-acfb-a4e4ec960024',
stock: 17,
reserved: 5,
cost: 624.12,
basePrice: 1448,
taxPercent: 10,
price: 1592.8,
weight: 0.55,
thumbnail: 'assets/images/apps/ecommerce/products/watch-08-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-08-01.jpg',
'assets/images/apps/ecommerce/products/watch-08-02.jpg',
'assets/images/apps/ecommerce/products/watch-08-03.jpg',
],
active: false,
},
{
id: '6e71be88-b225-474c-91e5-111ced7d6220',
category: '07986d93-d4eb-4de1-9448-2538407f7254',
name: 'Premera Ladies Chronograph Watch 40mm 5 ATM',
description:
'Velit fugiat adipisicing ut quis anim deserunt ex culpa nostrud laborum. Consectetur duis velit esse commodo voluptate magna dolor in enim exercitation. Ea aliquip cupidatat aute dolor tempor magna id laboris nulla eiusmod ut amet. Veniam irure ex incididunt officia commodo eiusmod nostrud ad consequat commodo ad voluptate.',
tags: [
'3baea410-a7d6-4916-b79a-bdce50c37f95',
'7d6dd47e-7472-4f8b-93d4-46c114c44533',
'8f868ddb-d4a2-461d-bc3b-d7c8668687c3',
'2300ac48-f268-466a-b765-8b878b6e14a7',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'ELH-2495',
barcode: '8268777127281',
brand: '5913ee46-a497-41db-a118-ee506011529f',
vendor: '05ebb527-d733-46a9-acfb-a4e4ec960024',
stock: 49,
reserved: 5,
cost: 738.91,
basePrice: 1848,
taxPercent: 30,
price: 2402.4,
weight: 0.54,
thumbnail: 'assets/images/apps/ecommerce/products/watch-09-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-09-01.jpg',
'assets/images/apps/ecommerce/products/watch-09-02.jpg',
'assets/images/apps/ecommerce/products/watch-09-03.jpg',
],
active: false,
},
{
id: '51242500-6983-4a78-bff3-d278eb4e3a57',
category: 'b899ec30-b85a-40ab-bb1f-18a596d5c6de',
name: 'Lara Mens Automatic Watch 44mm 10 ATM',
description:
'Enim laboris ut non elit dolore est consectetur. Duis irure minim elit velit anim incididunt minim ipsum ullamco ad dolore sunt. Proident aute proident velit elit ex reprehenderit ut. Lorem laborum excepteur elit proident sunt ipsum incididunt id do. Occaecat proident proident qui aute officia cupidatat aliqua aliqua nostrud proident laboris est ad qui. Magna eiusmod amet ut pariatur esse nisi aliquip deserunt minim ad et ea occaecat. Sunt enim cupidatat id eiusmod ea aute quis excepteur irure commodo dolore excepteur.',
tags: [
'167190fa-51b4-45fc-a742-8ce1b33d24ea',
'0fc39efd-f640-41f8-95a5-3f1d749df200',
'8837b93f-388b-43cc-851d-4ca8f23f3a61',
'0b11b742-3125-4d75-9a6f-84af7fde1969',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'ATT-6019',
barcode: '8452763551765',
brand: 'f9987124-7ada-4b93-bef7-35280b3ddbd7',
vendor: '998b0c07-abfd-4ba3-8de1-7563ef3c4d57',
stock: 24,
reserved: 4,
cost: 688.89,
basePrice: 1502,
taxPercent: 8,
price: 1622.16,
weight: 0.76,
thumbnail: 'assets/images/apps/ecommerce/products/watch-10-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-10-01.jpg',
'assets/images/apps/ecommerce/products/watch-10-02.jpg',
'assets/images/apps/ecommerce/products/watch-10-03.jpg',
],
active: true,
},
{
id: '844a4395-233f-4ffb-85bd-7baa0e490a88',
category: 'b899ec30-b85a-40ab-bb1f-18a596d5c6de',
name: 'Lara Mens Chronograph Watch 44mm 5 ATM',
description:
'Labore irure qui sunt consectetur. Elit nulla id cillum duis. Nulla nulla eu occaecat eiusmod duis irure id do esse. Ad eu incididunt voluptate amet nostrud ullamco mollit dolore occaecat cupidatat nisi reprehenderit. Proident fugiat laborum sit velit ea voluptate.',
tags: [
'167190fa-51b4-45fc-a742-8ce1b33d24ea',
'7d6dd47e-7472-4f8b-93d4-46c114c44533',
'8837b93f-388b-43cc-851d-4ca8f23f3a61',
'2300ac48-f268-466a-b765-8b878b6e14a7',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'ADH-2335',
barcode: '8385907318041',
brand: 'f9987124-7ada-4b93-bef7-35280b3ddbd7',
vendor: '05ebb527-d733-46a9-acfb-a4e4ec960024',
stock: 44,
reserved: 3,
cost: 708.41,
basePrice: 1467,
taxPercent: 18,
price: 1731.06,
weight: 0.7,
thumbnail: 'assets/images/apps/ecommerce/products/watch-11-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-11-01.jpg',
'assets/images/apps/ecommerce/products/watch-11-02.jpg',
'assets/images/apps/ecommerce/products/watch-11-03.jpg',
],
active: false,
},
{
id: '7520f1b6-3c45-46ef-a4d5-881971212d1e',
category: 'ad12aa94-3863-47f8-acab-a638ef02a3e9',
name: 'Benton Unisex Automatic Watch 40mm 10 ATM',
description:
'Esse nisi amet occaecat culpa aliqua est ad ea velit. Consectetur in voluptate sit pariatur eiusmod exercitation eu aute occaecat in duis. Voluptate consectetur eu commodo proident id sunt labore irure.',
tags: [
'8ec8f60d-552f-4216-9f11-462b95b1d306',
'0fc39efd-f640-41f8-95a5-3f1d749df200',
'8f868ddb-d4a2-461d-bc3b-d7c8668687c3',
'0b11b742-3125-4d75-9a6f-84af7fde1969',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'ATH-3064',
barcode: '8608510561856',
brand: 'e1789f32-9475-43e7-9256-451d2e3a2282',
vendor: '998b0c07-abfd-4ba3-8de1-7563ef3c4d57',
stock: 25,
reserved: 2,
cost: 731.94,
basePrice: 1743,
taxPercent: 10,
price: 1917.3,
weight: 0.47,
thumbnail: 'assets/images/apps/ecommerce/products/watch-12-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-12-01.jpg',
'assets/images/apps/ecommerce/products/watch-12-02.jpg',
'assets/images/apps/ecommerce/products/watch-12-03.jpg',
],
active: false,
},
{
id: '683e41d8-6ebc-4e6a-a7c1-9189ca52ef19',
category: 'b899ec30-b85a-40ab-bb1f-18a596d5c6de',
name: 'Zeon Mens Chronograph Watch 44mm 10 ATM',
description:
'Eu irure do cupidatat esse in. Aliqua laborum deserunt qui Lorem deserunt minim fugiat deserunt voluptate minim. Anim nulla tempor eiusmod ad exercitation reprehenderit officia. Nisi proident labore eu anim excepteur aliqua occaecat. Laboris nostrud ipsum commodo cupidatat.',
tags: [
'167190fa-51b4-45fc-a742-8ce1b33d24ea',
'7d6dd47e-7472-4f8b-93d4-46c114c44533',
'8837b93f-388b-43cc-851d-4ca8f23f3a61',
'0b11b742-3125-4d75-9a6f-84af7fde1969',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'ADV-3188',
barcode: '8334758988643',
brand: '2c4d98d8-f334-4125-9596-862515f5526b',
vendor: '987dd10a-43b1-49f9-bfd9-05bb2dbc7029',
stock: 14,
reserved: 5,
cost: 375.76,
basePrice: 786,
taxPercent: 30,
price: 1021.8,
weight: 0.53,
thumbnail: 'assets/images/apps/ecommerce/products/watch-13-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-13-01.jpg',
'assets/images/apps/ecommerce/products/watch-13-02.jpg',
'assets/images/apps/ecommerce/products/watch-13-03.jpg',
],
active: false,
},
{
id: 'd4e52238-292d-462b-b9bb-1751030132e2',
category: 'ad12aa94-3863-47f8-acab-a638ef02a3e9',
name: 'Lara Unisex Chronograph Watch 40mm 5 ATM',
description:
'Nulla nostrud aliquip consequat laborum ut enim exercitation. Aute dolor duis aliquip consequat minim officia. Nisi labore et magna et sunt consectetur id anim pariatur officia et esse ut. Ullamco dolor cillum consequat velit eiusmod consectetur. Ullamco reprehenderit tempor minim dolore officia do nisi cupidatat adipisicing fugiat velit.',
tags: [
'8ec8f60d-552f-4216-9f11-462b95b1d306',
'7d6dd47e-7472-4f8b-93d4-46c114c44533',
'8f868ddb-d4a2-461d-bc3b-d7c8668687c3',
'2300ac48-f268-466a-b765-8b878b6e14a7',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'ATT-7423',
barcode: '8417153336369',
brand: 'f9987124-7ada-4b93-bef7-35280b3ddbd7',
vendor: '998b0c07-abfd-4ba3-8de1-7563ef3c4d57',
stock: 33,
reserved: 2,
cost: 743.93,
basePrice: 1793,
taxPercent: 8,
price: 1936.44,
weight: 0.86,
thumbnail: 'assets/images/apps/ecommerce/products/watch-14-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-14-01.jpg',
'assets/images/apps/ecommerce/products/watch-14-02.jpg',
'assets/images/apps/ecommerce/products/watch-14-03.jpg',
],
active: false,
},
{
id: '98861dfc-0d21-4fd5-81aa-49785d003d95',
category: 'b899ec30-b85a-40ab-bb1f-18a596d5c6de',
name: 'Premera Mens Automatic Watch 44mm 10 ATM',
description:
'Veniam sint aliquip aliquip aliquip amet Lorem irure proident laborum et eiusmod aliqua. Aliquip deserunt voluptate magna ut quis magna dolor in dolore. Commodo adipisicing excepteur occaecat aute nisi in. Est aute ad ut incididunt anim ea commodo. Sunt excepteur duis sunt est laborum magna Lorem ullamco exercitation dolore irure.',
tags: [
'167190fa-51b4-45fc-a742-8ce1b33d24ea',
'0fc39efd-f640-41f8-95a5-3f1d749df200',
'8837b93f-388b-43cc-851d-4ca8f23f3a61',
'0b11b742-3125-4d75-9a6f-84af7fde1969',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'AAT-6453',
barcode: '8501386761670',
brand: '5913ee46-a497-41db-a118-ee506011529f',
vendor: '987dd10a-43b1-49f9-bfd9-05bb2dbc7029',
stock: 38,
reserved: 3,
cost: 364.64,
basePrice: 806,
taxPercent: 18,
price: 951.08,
weight: 0.59,
thumbnail: 'assets/images/apps/ecommerce/products/watch-15-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-15-01.jpg',
'assets/images/apps/ecommerce/products/watch-15-02.jpg',
'assets/images/apps/ecommerce/products/watch-15-03.jpg',
],
active: false,
},
{
id: 'a71f9b10-e884-4aad-9810-29fe10ce6d42',
category: '07986d93-d4eb-4de1-9448-2538407f7254',
name: 'Lara Ladies Chronograph Watch 40mm 5 ATM',
description:
'Deserunt non deserunt ut do labore cupidatat duis veniam in non adipisicing officia esse id. Adipisicing Lorem sint excepteur culpa labore consequat incididunt nulla minim amet. Sint do et fugiat laborum exercitation reprehenderit ut non nostrud occaecat nisi et qui dolore. Amet eiusmod nulla est officia ad magna cillum non dolor ullamco officia incididunt.',
tags: [
'3baea410-a7d6-4916-b79a-bdce50c37f95',
'7d6dd47e-7472-4f8b-93d4-46c114c44533',
'8f868ddb-d4a2-461d-bc3b-d7c8668687c3',
'2300ac48-f268-466a-b765-8b878b6e14a7',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'AAP-4902',
barcode: '8847387136582',
brand: 'f9987124-7ada-4b93-bef7-35280b3ddbd7',
vendor: '987dd10a-43b1-49f9-bfd9-05bb2dbc7029',
stock: 40,
reserved: 3,
cost: 525.3,
basePrice: 1303,
taxPercent: 10,
price: 1433.3,
weight: 0.69,
thumbnail: 'assets/images/apps/ecommerce/products/watch-16-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-16-01.jpg',
'assets/images/apps/ecommerce/products/watch-16-02.jpg',
'assets/images/apps/ecommerce/products/watch-16-03.jpg',
],
active: false,
},
{
id: '149e6db5-4ecc-4021-bc56-08b27514a746',
category: '07986d93-d4eb-4de1-9448-2538407f7254',
name: 'Lara Ladies Chronograph Watch 40mm 5 ATM',
description:
'Occaecat proident fugiat consectetur ullamco est. Duis non minim eiusmod magna dolor reprehenderit ad deserunt et qui amet. Tempor cillum dolore veniam Lorem sit ad pariatur et sint. Sunt anim et cupidatat Lorem proident fugiat incididunt incididunt minim non sint. Eiusmod quis et ullamco cillum et veniam do tempor officia sint.',
tags: [
'3baea410-a7d6-4916-b79a-bdce50c37f95',
'7d6dd47e-7472-4f8b-93d4-46c114c44533',
'8f868ddb-d4a2-461d-bc3b-d7c8668687c3',
'2300ac48-f268-466a-b765-8b878b6e14a7',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'ALV-194',
barcode: '8860845382207',
brand: 'f9987124-7ada-4b93-bef7-35280b3ddbd7',
vendor: '05ebb527-d733-46a9-acfb-a4e4ec960024',
stock: 20,
reserved: 2,
cost: 670.87,
basePrice: 1537,
taxPercent: 8,
price: 1659.96,
weight: 0.66,
thumbnail: 'assets/images/apps/ecommerce/products/watch-17-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-17-01.jpg',
'assets/images/apps/ecommerce/products/watch-17-02.jpg',
'assets/images/apps/ecommerce/products/watch-17-03.jpg',
],
active: false,
},
{
id: '655287de-2e24-41f3-a82f-8b08548ecc39',
category: 'b899ec30-b85a-40ab-bb1f-18a596d5c6de',
name: 'Zeon Mens Automatic Watch 44mm 10 ATM',
description:
'Eiusmod magna tempor est est quis eu. Minim irure magna anim mollit non adipisicing aute. Nostrud aute consectetur eu in non laboris excepteur esse esse occaecat officia.',
tags: [
'167190fa-51b4-45fc-a742-8ce1b33d24ea',
'0fc39efd-f640-41f8-95a5-3f1d749df200',
'8837b93f-388b-43cc-851d-4ca8f23f3a61',
'0b11b742-3125-4d75-9a6f-84af7fde1969',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'ADH-5492',
barcode: '8611606513571',
brand: '2c4d98d8-f334-4125-9596-862515f5526b',
vendor: '987dd10a-43b1-49f9-bfd9-05bb2dbc7029',
stock: 47,
reserved: 2,
cost: 645.13,
basePrice: 1581,
taxPercent: 10,
price: 1739.1,
weight: 0.54,
thumbnail: 'assets/images/apps/ecommerce/products/watch-18-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-18-01.jpg',
'assets/images/apps/ecommerce/products/watch-18-02.jpg',
'assets/images/apps/ecommerce/products/watch-18-03.jpg',
],
active: true,
},
{
id: 'c215b427-d840-4537-aea1-a9bdfa49441b',
category: 'ad12aa94-3863-47f8-acab-a638ef02a3e9',
name: 'Lara Unisex Automatic Watch 40mm 10 ATM',
description:
'Excepteur enim non qui consequat sunt exercitation laborum ipsum sunt. Sunt pariatur fugiat voluptate ipsum consectetur do magna culpa labore. Cupidatat non ex labore incididunt aliquip commodo est in. Consectetur mollit nisi aliquip cupidatat do laborum est ullamco velit aliqua fugiat qui adipisicing. Aute reprehenderit quis id sint nulla.',
tags: [
'8ec8f60d-552f-4216-9f11-462b95b1d306',
'0fc39efd-f640-41f8-95a5-3f1d749df200',
'8f868ddb-d4a2-461d-bc3b-d7c8668687c3',
'0b11b742-3125-4d75-9a6f-84af7fde1969',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'AAT-6702',
barcode: '8330223562386',
brand: 'f9987124-7ada-4b93-bef7-35280b3ddbd7',
vendor: '05ebb527-d733-46a9-acfb-a4e4ec960024',
stock: 21,
reserved: 3,
cost: 704.26,
basePrice: 1733,
taxPercent: 10,
price: 1906.3,
weight: 0.84,
thumbnail: 'assets/images/apps/ecommerce/products/watch-19-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-19-01.jpg',
'assets/images/apps/ecommerce/products/watch-19-02.jpg',
'assets/images/apps/ecommerce/products/watch-19-03.jpg',
],
active: true,
},
{
id: '8b1d9366-891e-49cd-aafb-ac65ce2741e2',
category: '07986d93-d4eb-4de1-9448-2538407f7254',
name: 'Zeon Ladies Automatic Watch 40mm 10 ATM',
description:
'Reprehenderit magna reprehenderit ex mollit Lorem labore ut. Duis consectetur aliqua cillum occaecat quis ex excepteur fugiat nulla nisi dolor minim. Elit voluptate exercitation nulla et ut adipisicing esse eu nisi amet eu. Ut cillum ipsum quis fugiat proident Lorem est aute ipsum sint dolore consequat.',
tags: [
'3baea410-a7d6-4916-b79a-bdce50c37f95',
'0fc39efd-f640-41f8-95a5-3f1d749df200',
'8f868ddb-d4a2-461d-bc3b-d7c8668687c3',
'0b11b742-3125-4d75-9a6f-84af7fde1969',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'EDH-5599',
barcode: '8309212335274',
brand: '2c4d98d8-f334-4125-9596-862515f5526b',
vendor: '05ebb527-d733-46a9-acfb-a4e4ec960024',
stock: 35,
reserved: 2,
cost: 712.66,
basePrice: 1711,
taxPercent: 30,
price: 2224.3,
weight: 0.47,
thumbnail: 'assets/images/apps/ecommerce/products/watch-20-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-20-01.jpg',
'assets/images/apps/ecommerce/products/watch-20-02.jpg',
'assets/images/apps/ecommerce/products/watch-20-03.jpg',
],
active: false,
},
{
id: '54e29534-518b-4006-b72a-f21fac6c4d5e',
category: 'b899ec30-b85a-40ab-bb1f-18a596d5c6de',
name: 'Lara Mens Chronograph Watch 44mm 10 ATM',
description:
'Officia eu magna eu amet fugiat qui ullamco eu. Occaecat dolore minim ad tempor consequat adipisicing non Lorem consequat. In nostrud incididunt adipisicing in. Irure occaecat aliquip deserunt minim officia ad excepteur do commodo magna.',
tags: [
'167190fa-51b4-45fc-a742-8ce1b33d24ea',
'7d6dd47e-7472-4f8b-93d4-46c114c44533',
'8837b93f-388b-43cc-851d-4ca8f23f3a61',
'0b11b742-3125-4d75-9a6f-84af7fde1969',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'ADP-3719',
barcode: '8879167838673',
brand: 'f9987124-7ada-4b93-bef7-35280b3ddbd7',
vendor: '998b0c07-abfd-4ba3-8de1-7563ef3c4d57',
stock: 28,
reserved: 3,
cost: 374.38,
basePrice: 749,
taxPercent: 8,
price: 808.92,
weight: 0.52,
thumbnail: 'assets/images/apps/ecommerce/products/watch-21-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-21-01.jpg',
'assets/images/apps/ecommerce/products/watch-21-02.jpg',
'assets/images/apps/ecommerce/products/watch-21-03.jpg',
],
active: false,
},
{
id: '6a5726e8-c467-45ea-92ab-d83235a06405',
category: 'b899ec30-b85a-40ab-bb1f-18a596d5c6de',
name: 'Premera Mens Chronograph Watch 44mm 10 ATM',
description:
'Duis id consequat ex officia nisi. Et reprehenderit tempor sunt nostrud. Duis dolore tempor anim non duis qui aute magna officia. Ullamco proident esse enim amet nostrud occaecat veniam. Nostrud ea eiusmod laborum id laborum veniam nulla. Voluptate proident ullamco exercitation id consequat dolore id pariatur esse nulla consectetur.',
tags: [
'167190fa-51b4-45fc-a742-8ce1b33d24ea',
'7d6dd47e-7472-4f8b-93d4-46c114c44533',
'8837b93f-388b-43cc-851d-4ca8f23f3a61',
'0b11b742-3125-4d75-9a6f-84af7fde1969',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'ATH-3399',
barcode: '8356410903599',
brand: '5913ee46-a497-41db-a118-ee506011529f',
vendor: '987dd10a-43b1-49f9-bfd9-05bb2dbc7029',
stock: 20,
reserved: 2,
cost: 444.68,
basePrice: 1103,
taxPercent: 18,
price: 1301.54,
weight: 0.56,
thumbnail: 'assets/images/apps/ecommerce/products/watch-22-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-22-01.jpg',
'assets/images/apps/ecommerce/products/watch-22-02.jpg',
'assets/images/apps/ecommerce/products/watch-22-03.jpg',
],
active: false,
},
{
id: 'd7d1d6df-e91f-4c53-982a-2720bc2b4cdd',
category: 'ad12aa94-3863-47f8-acab-a638ef02a3e9',
name: 'Capmia Unisex Automatic Watch 40mm 10 ATM',
description:
'Voluptate consectetur nisi aliquip cupidatat sunt labore. Adipisicing voluptate tempor sunt eu irure cupidatat laboris. Enim aliquip aute sit non laborum Lorem in enim duis eu deserunt. Laboris magna irure aute ut proident fugiat laborum aliquip tempor nostrud id. Et esse cupidatat sunt ullamco reprehenderit enim dolore ea in do esse esse id.',
tags: [
'8ec8f60d-552f-4216-9f11-462b95b1d306',
'0fc39efd-f640-41f8-95a5-3f1d749df200',
'8f868ddb-d4a2-461d-bc3b-d7c8668687c3',
'0b11b742-3125-4d75-9a6f-84af7fde1969',
'b1286f3a-e2d0-4237-882b-f0efc0819ec3',
],
sku: 'EAV-4030',
barcode: '8545771786193',
brand: '61d52c2a-8947-4a2c-8c35-f36baef45b96',
vendor: '998b0c07-abfd-4ba3-8de1-7563ef3c4d57',
stock: 23,
reserved: 3,
cost: 538.72,
basePrice: 1213,
taxPercent: 10,
price: 1334.3,
weight: 0.75,
thumbnail: 'assets/images/apps/ecommerce/products/watch-23-thumb.jpg',
images: [
'assets/images/apps/ecommerce/products/watch-23-01.jpg',
'assets/images/apps/ecommerce/products/watch-23-02.jpg',
'assets/images/apps/ecommerce/products/watch-23-03.jpg',
],
active: true,
},
];

View File

@ -53,6 +53,13 @@ export const defaultNavigation: FuseNavigationItem[] = [
icon: 'heroicons_outline:academic-cap', icon: 'heroicons_outline:academic-cap',
link: '/member/casinomoney', link: '/member/casinomoney',
}, },
{
id: 'member.unconnected',
title: 'Unconnected',
type: 'basic',
icon: 'heroicons_outline:academic-cap',
link: '/member/unconnected',
},
], ],
}, },
{ {

View File

@ -13,6 +13,7 @@ import { IconsMockApi } from 'app/mock-api/ui/icons/api';
import { MailboxMockApi } from 'app/mock-api/apps/mailbox/api'; import { MailboxMockApi } from 'app/mock-api/apps/mailbox/api';
import { MemberUserMockApi } from 'app/mock-api/apps/member/user/api'; import { MemberUserMockApi } from 'app/mock-api/apps/member/user/api';
import { MemberCasinomoneyMockApi } from './apps/member/casinomoney/api'; import { MemberCasinomoneyMockApi } from './apps/member/casinomoney/api';
import { MemberUnconnectedMockApi } from './apps/member/unconnected/api';
import { MessagesMockApi } from 'app/mock-api/common/messages/api'; import { MessagesMockApi } from 'app/mock-api/common/messages/api';
import { NavigationMockApi } from 'app/mock-api/common/navigation/api'; import { NavigationMockApi } from 'app/mock-api/common/navigation/api';
import { NotesMockApi } from 'app/mock-api/apps/notes/api'; import { NotesMockApi } from 'app/mock-api/apps/notes/api';
@ -46,6 +47,7 @@ export const mockApiServices = [
MailboxMockApi, MailboxMockApi,
MemberUserMockApi, MemberUserMockApi,
MemberCasinomoneyMockApi, MemberCasinomoneyMockApi,
MemberUnconnectedMockApi,
MessagesMockApi, MessagesMockApi,
NavigationMockApi, NavigationMockApi,
NotesMockApi, NotesMockApi,

View File

@ -0,0 +1,3 @@
import { ListComponent } from './list.component';
export const COMPONENTS = [ListComponent];

View File

@ -0,0 +1,345 @@
<div
class="sm:absolute sm:inset-0 flex flex-col flex-auto min-w-0 sm:overflow-hidden bg-card dark:bg-transparent"
>
<!-- Header -->
<div
class="relative flex flex-col sm:flex-row flex-0 sm:items-center sm:justify-between py-8 px-6 md:px-8 border-b"
>
<!-- Loader -->
<div class="absolute inset-x-0 bottom-0" *ngIf="isLoading">
<mat-progress-bar [mode]="'indeterminate'"></mat-progress-bar>
</div>
<!-- Title -->
<div class="text-4xl font-extrabold tracking-tight">장기미접속회원</div>
<!-- Actions -->
<div class="flex shrink-0 items-center mt-6 sm:mt-0 sm:ml-4">
<!-- button -->
<button mat-flat-button [color]="'primary'">15일</button>
<button mat-flat-button [color]="'primary'">30일</button>
<button mat-flat-button [color]="'primary'">60일</button>
<button mat-flat-button [color]="'primary'">90일</button>
<button mat-flat-button [color]="'primary'">120일</button>
<button mat-flat-button [color]="'primary'">가입후미접속</button>
<!-- Main -->
<div class="flex flex-auto overflow-hidden">
<!-- Products list -->
<div
class="flex flex-col flex-auto sm:mb-18 overflow-hidden sm:overflow-y-auto"
>
<ng-container *ngIf="unconnecteds$ | async as unconnecteds">
<ng-container *ngIf="unconnecteds.length > 0; else noUnconnected">
<div class="grid">
<!-- Header -->
<div
class="inventory-grid z-10 sticky top-0 grid gap-4 py-4 px-6 md:px-8 shadow text-md font-semibold text-secondary bg-gray-50 dark:bg-black dark:bg-opacity-5"
matSort
matSortDisableClear
>
<div></div>
<div class="hidden sm:block" [mat-sort-header]="'rank'">
등급
</div>
<div class="hidden sm:block" [mat-sort-header]="'id'">
아이디
</div>
<div class="hidden sm:block" [mat-sort-header]="'nickname'">
닉네임
</div>
<div
class="hidden sm:block"
[mat-sort-header]="'accountHolder'"
>
예금주
</div>
<div class="hidden sm:block" [mat-sort-header]="'level'">
레벨
</div>
<div
class="hidden sm:block"
[mat-sort-header]="'calculateType'"
>
정산종류
</div>
<div class="hidden sm:block" [mat-sort-header]="'contact'">
연락처
</div>
<div class="hidden sm:block" [mat-sort-header]="'cash'">
캐쉬
</div>
<div class="hidden sm:block" [mat-sort-header]="'comp'">
콤프
</div>
<div class="hidden sm:block" [mat-sort-header]="'charge'">
충전금
</div>
<div class="hidden sm:block" [mat-sort-header]="'exchange'">
환전금
</div>
<div class="hidden sm:block" [mat-sort-header]="'revenue'">
수익금
</div>
<div class="hidden sm:block" [mat-sort-header]="'accession'">
가입날짜
</div>
<div class="hidden sm:block" [mat-sort-header]="'final'">
최근접속일
</div>
<div class="hidden sm:block" [mat-sort-header]="'state'">
상태
</div>
<div class="hidden sm:block" [mat-sort-header]="''">쪽지</div>
<div class="hidden sm:block" [mat-sort-header]="'highest'">
최상부
</div>
<div class="hidden sm:block" [mat-sort-header]="'highRank'">
직속
</div>
<div class="hidden sm:block" [mat-sort-header]="'members'">
회원수
</div>
<!-- <div class="hidden md:block" [mat-sort-header]="'sku'">SKU</div>
<div [mat-sort-header]="'name'">Name</div>
<div class="hidden sm:block" [mat-sort-header]="'price'">
Price
</div>
<div class="hidden lg:block" [mat-sort-header]="'stock'">
Stock
</div>
<div class="hidden lg:block" [mat-sort-header]="'active'">
Active
</div>
<div class="hidden sm:block">Details</div> -->
</div>
<!-- Rows -->
<ng-container *ngIf="unconnecteds$ | async as unconnecteds">
<ng-container
*ngFor="
let unconnected of unconnecteds;
trackBy: __trackByFn
"
>
<div
class="inventory-grid grid items-center gap-4 py-3 px-6 md:px-8 border-b"
>
<!-- rank -->
<div class="hidden sm:block truncate">
{{ unconnected.rank }}
</div>
<!-- id -->
<ng-container *ngIf="users$ | async as users">
<ng-container
*ngFor="let user of users; trackBy: __trackByFn"
>
<div
class="hidden sm:block truncate"
(click)="viewUserDetail(user.id)"
>
{{ unconnected.id }}
</div>
</ng-container>
</ng-container>
<!-- nickname -->
<div class="hidden sm:block truncate">
{{ unconnected.nickname }}
</div>
<!-- accountHolder -->
<div class="hidden sm:block truncate">
{{ unconnected.accountHolder }}
</div>
<!-- level -->
<div class="hidden sm:block truncate">
LV.{{ unconnected.level }}
</div>
<!-- calculateType -->
<div class="hidden sm:block truncate">
{{ unconnected.calculateType }}
</div>
<!-- contact -->
<div class="hidden sm:block truncate">
{{ unconnected.contact }}
</div>
<!-- cash -->
<div class="hidden sm:block truncate">
캐쉬{{ unconnected.cash }}
</div>
<!-- comp -->
<div class="hidden sm:block truncate">
comp{{ unconnected.comp }}
</div>
<!-- charge -->
<div class="hidden sm:block truncate">
{{ unconnected.charge }}
</div>
<!-- exchange -->
<div class="hidden sm:block truncate">
{{ unconnected.exchange }}
</div>
<!-- revenue -->
<div class="hidden sm:block truncate">
{{ unconnected.revenue }}
</div>
<!-- accession -->
<div class="hidden sm:block truncate">
{{ unconnected.accession }}
</div>
<!-- final -->
<div class="hidden sm:block truncate">
{{ unconnected.final }}
</div>
<!-- state -->
<div class="hidden sm:block truncate">
{{ unconnected.state }}
</div>
<!-- message -->
<div class="hidden sm:block truncate">
<button mat-flat-button [color]="'primary'">
<mat-icon svgIcon="heroicons_outline:mail"></mat-icon>
</button>
</div>
<!-- highest -->
<div class="hidden sm:block truncate">
{{ unconnected.highest }}
</div>
<!-- highRank -->
<div class="hidden sm:block truncate">
{{ unconnected.highRank }}
</div>
<!-- members -->
<div class="hidden sm:block truncate">
{{ unconnected.members }}
</div>
<!-- Image -->
<!-- <div class="flex items-center">
<div
class="relative flex flex-0 items-center justify-center w-12 h-12 mr-6 rounded overflow-hidden border"
>
<img
class="w-8"
*ngIf="user.thumbnail"
[alt]="'Product thumbnail image'"
[src]="user.thumbnail"
/>
<div
class="flex items-center justify-center w-full h-full text-xs font-semibold leading-none text-center uppercase"
*ngIf="!user.thumbnail"
>
NO THUMB
</div>
</div>
</div> -->
<!-- SKU -->
<!-- <div class="hidden md:block truncate">
{{ user.sku }}
</div> -->
<!-- Name -->
<!-- <div class="truncate">
{{ user.name }}
</div> -->
<!-- Price -->
<!-- <div class="hidden sm:block">
{{ user.price | currency: "USD":"symbol":"1.2-2" }}
</div> -->
<!-- Stock -->
<!-- <div class="hidden lg:flex items-center">
<div class="min-w-4">{{ user.stock }}</div> -->
<!-- Low stock -->
<!-- <div
class="flex items-end ml-2 w-1 h-4 bg-red-200 rounded overflow-hidden"
*ngIf="user.stock < 20"
>
<div class="flex w-full h-1/3 bg-red-600"></div>
</div> -->
<!-- Medium stock -->
<!-- <div
class="flex items-end ml-2 w-1 h-4 bg-orange-200 rounded overflow-hidden"
*ngIf="user.stock >= 20 && user.stock < 30"
>
<div class="flex w-full h-2/4 bg-orange-400"></div>
</div> -->
<!-- High stock -->
<!-- <div
class="flex items-end ml-2 w-1 h-4 bg-green-100 rounded overflow-hidden"
*ngIf="user.stock >= 30"
>
<div class="flex w-full h-full bg-green-400"></div>
</div>
</div> -->
<!-- Active -->
<!-- <div class="hidden lg:block">
<ng-container *ngIf="user.active">
<mat-icon
class="text-green-400 icon-size-5"
[svgIcon]="'heroicons_solid:check'"
></mat-icon>
</ng-container>
<ng-container *ngIf="!user.active">
<mat-icon
class="text-gray-400 icon-size-5"
[svgIcon]="'heroicons_solid:x'"
></mat-icon>
</ng-container>
</div> -->
<!-- Details button -->
<!-- <div>
<button
class="min-w-10 min-h-7 h-7 px-2 leading-6"
mat-stroked-button
(click)="__toggleDetails(user.id)"
>
<mat-icon
class="icon-size-5"
[svgIcon]="
selectedUser?.id === user.id
? 'heroicons_solid:chevron-up'
: 'heroicons_solid:chevron-down'
"
></mat-icon>
</button>
</div> -->
</div>
</ng-container>
</ng-container>
</div>
<mat-paginator
class="sm:absolute sm:inset-x-0 sm:bottom-0 border-b sm:border-t sm:border-b-0 z-10 bg-gray-50 dark:bg-transparent"
[ngClass]="{ 'pointer-events-none': isLoading }"
[length]="pagination?.length"
[pageIndex]="pagination?.page"
[pageSize]="pagination?.size"
[pageSizeOptions]="[5, 10, 25, 100]"
[showFirstLastButtons]="true"
></mat-paginator>
</ng-container>
</ng-container>
<ng-template #noUnconnected>
<div
class="p-8 sm:p-16 border-t text-4xl font-semibold tracking-tight text-center"
>
There are no unconnected!
</div>
</ng-template>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,198 @@
import {
AfterViewInit,
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
OnDestroy,
OnInit,
ViewChild,
ViewEncapsulation,
} from '@angular/core';
import {
FormBuilder,
FormControl,
FormGroup,
Validators,
} from '@angular/forms';
import { MatCheckboxChange } from '@angular/material/checkbox';
import { MatPaginator } from '@angular/material/paginator';
import { MatSort } from '@angular/material/sort';
import {
debounceTime,
map,
merge,
Observable,
Subject,
switchMap,
takeUntil,
} from 'rxjs';
import { fuseAnimations } from '@fuse/animations';
import { FuseConfirmationService } from '@fuse/services/confirmation';
import { User } from '../../user/models/user';
import { Unconnected } from '../models/unconnected';
import { UnconnectedPagination } from '../models/unconnected-pagination';
import { UnconnectedService } from '../services/unconnected.service';
import { Router } from '@angular/router';
@Component({
selector: 'unconnected-list',
templateUrl: './list.component.html',
styles: [
/* language=SCSS */
`
.inventory-grid {
grid-template-columns: 60px auto 40px;
@screen sm {
grid-template-columns: 60px auto 60px 72px;
}
@screen md {
grid-template-columns: 60px 60px auto 112px 72px;
}
@screen lg {
grid-template-columns: 60px 60px auto 112px 96px 96px 72px;
}
}
`,
],
encapsulation: ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush,
animations: fuseAnimations,
})
export class ListComponent implements OnInit, AfterViewInit, OnDestroy {
@ViewChild(MatPaginator) private _paginator!: MatPaginator;
@ViewChild(MatSort) private _sort!: MatSort;
unconnecteds$!: Observable<Unconnected[] | undefined>;
users$!: Observable<User[] | undefined>;
isLoading = false;
searchInputControl = new FormControl();
selectedUnconnected?: Unconnected;
pagination?: UnconnectedPagination;
private _unsubscribeAll: Subject<any> = new Subject<any>();
/**
* Constructor
*/
constructor(
private _changeDetectorRef: ChangeDetectorRef,
private _fuseConfirmationService: FuseConfirmationService,
private _formBuilder: FormBuilder,
private _unconnectedService: UnconnectedService,
private router: Router
) {}
// -----------------------------------------------------------------------------------------------------
// @ Lifecycle hooks
// -----------------------------------------------------------------------------------------------------
/**
* On init
*/
ngOnInit(): void {
// Get the pagination
this._unconnectedService.pagination$
.pipe(takeUntil(this._unsubscribeAll))
.subscribe((pagination: UnconnectedPagination | undefined) => {
// Update the pagination
this.pagination = pagination;
// Mark for check
this._changeDetectorRef.markForCheck();
});
// Get the products
this.unconnecteds$ = this._unconnectedService.unconnecteds$;
}
/**
* After view init
*/
ngAfterViewInit(): void {
if (this._sort && this._paginator) {
// Set the initial sort
this._sort.sort({
id: 'name',
start: 'asc',
disableClear: true,
});
// Mark for check
this._changeDetectorRef.markForCheck();
// If the unconnected changes the sort order...
this._sort.sortChange
.pipe(takeUntil(this._unsubscribeAll))
.subscribe(() => {
// Reset back to the first page
this._paginator.pageIndex = 0;
});
// Get products if sort or page changes
merge(this._sort.sortChange, this._paginator.page)
.pipe(
switchMap(() => {
this.isLoading = true;
return this._unconnectedService.getUnconnecteds(
this._paginator.pageIndex,
this._paginator.pageSize,
this._sort.active,
this._sort.direction
);
}),
map(() => {
this.isLoading = false;
})
)
.subscribe();
}
}
/**
* On destroy
*/
ngOnDestroy(): void {
// Unsubscribe from all subscriptions
this._unsubscribeAll.next(null);
this._unsubscribeAll.complete();
}
// -----------------------------------------------------------------------------------------------------
// @ Public methods
// -----------------------------------------------------------------------------------------------------
viewUserDetail(id: string): void {
let url: string = 'member/user/' + id;
this.router.navigateByUrl(url);
}
// -----------------------------------------------------------------------------------------------------
// @ Private methods
// -----------------------------------------------------------------------------------------------------
/**
* Create product
*/
__createProduct(): void {}
/**
* Toggle product details
*
* @param productId
*/
__toggleDetails(productId: string): void {}
/**
* Track by function for ngFor loops
*
* @param index
* @param item
*/
__trackByFn(index: number, item: any): any {
return item.id || index;
}
}

View File

@ -0,0 +1,8 @@
export interface UnconnectedPagination {
length: number;
size: number;
page: number;
lastPage: number;
startIndex: number;
endIndex: number;
}

View File

@ -0,0 +1,39 @@
export interface Unconnected {
id?: string;
category?: string;
name?: string;
description?: string;
tags?: string[];
sku?: string | null;
barcode?: string | null;
brand?: string | null;
vendor?: string | null;
stock?: number;
reserved?: number;
cost?: number;
basePrice?: number;
taxPercent?: number;
price?: number;
weight?: number;
thumbnail?: string;
images?: string[];
active?: boolean;
nickname?: string;
highRank?: string;
rank?: string;
level?: string;
calculateType: string;
accountHolder?: string;
contact?: string;
cash?: number;
comp?: number;
accession?: string;
final?: string;
state?: string;
charge?: number;
exchange?: number;
revenue?: number;
highest?: string;
members?: number;
}

View File

@ -0,0 +1,89 @@
import { Injectable } from '@angular/core';
import {
ActivatedRouteSnapshot,
Resolve,
Router,
RouterStateSnapshot,
} from '@angular/router';
import { catchError, Observable, throwError } from 'rxjs';
import { Unconnected } from '../models/unconnected';
import { UnconnectedPagination } from '../models/unconnected-pagination';
import { UnconnectedService } from '../services/unconnected.service';
@Injectable({
providedIn: 'root',
})
export class UnconnectedResolver implements Resolve<any> {
/**
* Constructor
*/
constructor(
private _unconnectedService: UnconnectedService,
private _router: Router
) {}
// -----------------------------------------------------------------------------------------------------
// @ Public methods
// -----------------------------------------------------------------------------------------------------
/**
* Resolver
*
* @param route
* @param state
*/
resolve(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<Unconnected | undefined> {
return this._unconnectedService
.getUnconnectedById(route.paramMap.get('id'))
.pipe(
// Error here means the requested product is not available
catchError((error) => {
// Log the error
console.error(error);
// Get the parent url
const parentUrl = state.url.split('/').slice(0, -1).join('/');
// Navigate to there
this._router.navigateByUrl(parentUrl);
// Throw an error
return throwError(error);
})
);
}
}
@Injectable({
providedIn: 'root',
})
export class UnconnectedsResolver implements Resolve<any> {
/**
* Constructor
*/
constructor(private _unconnectedService: UnconnectedService) {}
// -----------------------------------------------------------------------------------------------------
// @ Public methods
// -----------------------------------------------------------------------------------------------------
/**
* Resolver
*
* @param route
* @param state
*/
resolve(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<{
pagination: UnconnectedPagination;
unconnecteds: Unconnected[];
}> {
return this._unconnectedService.getUnconnecteds();
}
}

View File

@ -0,0 +1,158 @@
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import {
BehaviorSubject,
filter,
map,
Observable,
of,
switchMap,
take,
tap,
throwError,
} from 'rxjs';
import { Unconnected } from '../models/unconnected';
import { UnconnectedPagination } from '../models/unconnected-pagination';
@Injectable({
providedIn: 'root',
})
export class UnconnectedService {
// Private
private __pagination = new BehaviorSubject<UnconnectedPagination | undefined>(
undefined
);
private __unconnected = new BehaviorSubject<Unconnected | undefined>(
undefined
);
private __unconnecteds = new BehaviorSubject<Unconnected[] | undefined>(
undefined
);
/**
* Constructor
*/
constructor(private _httpClient: HttpClient) {}
// -----------------------------------------------------------------------------------------------------
// @ Accessors
// -----------------------------------------------------------------------------------------------------
/**
* Getter for pagination
*/
get pagination$(): Observable<UnconnectedPagination | undefined> {
return this.__pagination.asObservable();
}
/**
* Getter for unconnected
*/
get unconnected$(): Observable<Unconnected | undefined> {
return this.__unconnected.asObservable();
}
/**
* Getter for unconnecteds
*/
get unconnecteds$(): Observable<Unconnected[] | undefined> {
return this.__unconnecteds.asObservable();
}
// -----------------------------------------------------------------------------------------------------
// @ Public methods
// -----------------------------------------------------------------------------------------------------
/**
* Get unconnecteds
*
*
* @param page
* @param size
* @param sort
* @param order
* @param search
*/
getUnconnecteds(
page: number = 0,
size: number = 10,
sort: string = 'name',
order: 'asc' | 'desc' | '' = 'asc',
search: string = ''
): Observable<{
pagination: UnconnectedPagination;
unconnecteds: Unconnected[];
}> {
return this._httpClient
.get<{ pagination: UnconnectedPagination; unconnecteds: Unconnected[] }>(
'api/apps/member/unconnected/unconnecteds',
{
params: {
page: '' + page,
size: '' + size,
sort,
order,
search,
},
}
)
.pipe(
tap((response) => {
this.__pagination.next(response.pagination);
this.__unconnecteds.next(response.unconnecteds);
})
);
}
/**
* Get product by id
*/
getUnconnectedById(id: string | null): Observable<Unconnected> {
return this.__unconnecteds.pipe(
take(1),
map((unconnecteds) => {
// Find the product
const unconnected =
unconnecteds?.find((item) => item.id === id) || undefined;
// Update the product
this.__unconnected.next(unconnected);
// Return the product
return unconnected;
}),
switchMap((product) => {
if (!product) {
return throwError('Could not found product with id of ' + id + '!');
}
return of(product);
})
);
}
/**
* Create product
*/
createUnconnected(): Observable<Unconnected> {
return this.unconnecteds$.pipe(
take(1),
switchMap((unconnecteds) =>
this._httpClient
.post<Unconnected>('api/apps/member/unconnected/product', {})
.pipe(
map((newUnconnected) => {
// Update the unconnecteds with the new product
if (!!unconnecteds) {
this.__unconnecteds.next([newUnconnected, ...unconnecteds]);
}
// Return the new product
return newUnconnected;
})
)
)
);
}
}

View File

@ -0,0 +1,48 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { MatButtonModule } from '@angular/material/button';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input';
import { MatPaginatorModule } from '@angular/material/paginator';
import { MatProgressBarModule } from '@angular/material/progress-bar';
import { MatRippleModule } from '@angular/material/core';
import { MatSortModule } from '@angular/material/sort';
import { MatSelectModule } from '@angular/material/select';
import { MatTooltipModule } from '@angular/material/tooltip';
import { MatGridListModule } from '@angular/material/grid-list';
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
import { MatRadioModule } from '@angular/material/radio';
import { TranslocoModule } from '@ngneat/transloco';
import { SharedModule } from 'app/shared/shared.module';
import { COMPONENTS } from './components';
import { unconnectedRoutes } from './unconnected.routing';
@NgModule({
declarations: [COMPONENTS],
imports: [
TranslocoModule,
SharedModule,
RouterModule.forChild(unconnectedRoutes),
MatButtonModule,
MatFormFieldModule,
MatIconModule,
MatInputModule,
MatPaginatorModule,
MatProgressBarModule,
MatRippleModule,
MatSortModule,
MatSelectModule,
MatTooltipModule,
MatGridListModule,
MatSlideToggleModule,
MatRadioModule,
],
})
export class UnconnectedModule {}

View File

@ -0,0 +1,24 @@
import { Route } from '@angular/router';
import { ListComponent } from './components/list.component';
import { ViewComponent } from '../user/components/view.component';
import { UnconnectedsResolver } from './resolvers/unconnected.resolver';
import { UserResolver } from '../user/resolvers/user.resolver';
export const unconnectedRoutes: Route[] = [
{
path: '',
component: ListComponent,
resolve: {
unconnecteds: UnconnectedsResolver,
},
},
{
path: ':id',
component: ViewComponent,
resolve: {
users: UserResolver,
},
},
];

View File

@ -4,6 +4,7 @@
"Member": "Member", "Member": "Member",
"User": "User", "User": "User",
"Casinomoney": "Casinomoney", "Casinomoney": "Casinomoney",
"Unconnected": "Unconnected",
"Project": "Project", "Project": "Project",
"Partner": "Partner", "Partner": "Partner",
"Analytics": "Analytics", "Analytics": "Analytics",

View File

@ -4,6 +4,7 @@
"Member": "회원", "Member": "회원",
"User": "사용자", "User": "사용자",
"Casinomoney": "CASINO 머니파악", "Casinomoney": "CASINO 머니파악",
"Unconnected": "장기미접속회원",
"Project": "프로젝트", "Project": "프로젝트",
"Partner": "파트너", "Partner": "파트너",
"Analytics": "Analytics", "Analytics": "Analytics",