powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Single page aplication
25 сообщений из 73, страница 1 из 3
Single page aplication
    #38933071
Lolka1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Парни, можете посоветовать какие-нибудь мануалы по изучению SPA?
Сам не разработчик, но тут приспичило кое-что напрогать..
...
Рейтинг: 0 / 0
Single page aplication
    #38933081
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SPA - это не технология - это концепция.

Так что надо определиться сначала, на чем планируется реализовывать, а потом уже мануалы выбирать.
...
Рейтинг: 0 / 0
Single page aplication
    #38933096
Lolka1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

ASP.Net
...
Рейтинг: 0 / 0
Single page aplication
    #38933101
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASP.Net WebForms? ASP.NET MVC?
...
Рейтинг: 0 / 0
Single page aplication
    #38933106
Lolka1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

MVC
...
Рейтинг: 0 / 0
Single page aplication
    #38933120
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Single page aplication
    #38933123
Lolka1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Большое спасибо, начну изучать
...
Рейтинг: 0 / 0
Single page aplication
    #38933139
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Single page aplication
    #38934005
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот туториал по созданию своего собственного сайта на SPA
...
Рейтинг: 0 / 0
Single page aplication
    #38934008
Calabonga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Single page aplication
    #38934397
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calabonga
Что такое SPA или одностраничный портал

Breeze-то тут причём?
Кстати, он вроде бы тихо умер. По крайней мере, Джон Паппа - "папа" Бриза давно про него не вспоминает.
Человек только начинает, а вы ему втюхиваете свой венигрет всевозможных пакетов, непонятно зачем собранных вместе.
...
Рейтинг: 0 / 0
Single page aplication
    #38934399
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lolka1Парни, можете посоветовать какие-нибудь мануалы по изучению SPA?
Сам не разработчик, но тут приспичило кое-что напрогать..
наверное тогда лучше почитать про KnockoutJS, он наиболее простой.
...
Рейтинг: 0 / 0
Single page aplication
    #38934407
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buredLolka1Парни, можете посоветовать какие-нибудь мануалы по изучению SPA?
Сам не разработчик, но тут приспичило кое-что напрогать..
наверное тогда лучше почитать про KnockoutJS, он наиболее простой.

Какое отношение имеет KnockoutJS к SPA?
...
Рейтинг: 0 / 0
Single page aplication
    #38934408
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttburedпропущено...

наверное тогда лучше почитать про KnockoutJS, он наиболее простой.

Какое отношение имеет KnockoutJS к SPA?На нём можно нужно построить SPA-фреймворк. :-)
...
Рейтинг: 0 / 0
Single page aplication
    #38934411
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНа нём можно нужно построить SPA-фреймворк. :-)

Ну дык и на VanillaJS тоже можно.. ))

Роутинг?
Модули?
DI?
Фабрики?
Модели?
REST/API?
Контроллеры?
Костная архитектура?

Нифига нет. Называется, засучивай рукава и пили. Если же хочется сосредоточиться на решении задачи, а не написании очередного велосипеда, надо брать нормальный SPA-фреймфорк и не выёживаться
...
Рейтинг: 0 / 0
Single page aplication
    #38934412
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

2-ой ангуляр, кстати, запилен на расовом тайпскрипте, советую присмотреться и выкинуть эти свои поигрушки детсадовские на нокауте
...
Рейтинг: 0 / 0
Single page aplication
    #38934414
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей КНа нём можно нужно построить SPA-фреймворк. :-)

Ну дык и на VanillaJS тоже можно.. ))

Роутинг?Что это? Зачем? Мне не надо.
hVosttМодули?AMD
hVosttDI?Мне не надо.
hVosttФабрики?Что это? Наверное, это есть в велосипеде.
hVosttМодели?Что это? Наверное, это есть в велосипеде.
hVosttREST/API?Да.
hVosttКонтроллеры?В последнем KO добавлен Component. Жаль, что поздно добавили, уже был написан свой велосипед.
hVosttКостная архитектура?Что за новая концепция?
hVosttНифига нет. Называется, засучивай рукава и пили.Ты программист, или где?
hVosttЕсли же хочется сосредоточиться на решении задачи, а не написании очередного велосипедаМне мой велосипед нравится больше.
hVosttнадо брать нормальный SPA-фреймфорк и не выёживаться Нормальных нет.
...
Рейтинг: 0 / 0
Single page aplication
    #38934468
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVosttРоутинг?Что это? Зачем? Мне не надо.

Если ты не понимаешь что такое роутинг и зачем это надо, значит у тебя ещё нет опыта в разработке SPA.

Алексей КhVosttМодули?AMD

да, вижу что это есть.

Алексей КhVosttМодели?Что это? Наверное, это есть в велосипеде

получаешь данные, оборачиваешь во вью-модели? отправляешь, сериализуешь вью-модель в JSON?

Алексей КhVosttREST/API?Да.

не ври себе

Код: javascript
1.
2.
3.
4.
var data = /* Your data in JSON format - see below */;
$.post("/some/url", data, function(returnedData) {
    // This callback is executed if the post was successful     
})



Алексей КhVosttКостная архитектура?Что за новая концепция?

это значит, что тебе на надо думать над основной архитектурой, она уже есть из коробки. сразу пишешь модели, логику и шаблоны. не паришься как это всё организовать, даже структуру папок и файлов SPA фреймворк уже предусматривает.

для стороннего разработчика на типичной архитектуре фреймворка это означает возможность очень легко и быстро влиться в разработку, без вникания в дебри больной, безумной фантазии велосипедостроя (уж поверь мне, я ковырял твой Simple Solution Project, и самому ненавистному врагу не пожелаю поддерживать это или нечто подобное), а с фантазией обычно у авторов всё впорядке, не надо ни пить, ни курить, достаточно редактора кода

Алексей КТы программист, или где?

Я командный программист в первую очередь, для меня обеспечение комфортной разработки/сопровождения в команде в абсолютном приоритете. Что означает НЕТ велосипедам там, где можно обойтись без них. Чем меньше велосипедов, тем проще сопровождать и разрабатывать.

Алексей КНормальных нет.

У всех фатальный недостаток?
...
Рейтинг: 0 / 0
Single page aplication
    #38934503
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей Кпропущено...
Что это? Зачем? Мне не надо.

Если ты не понимаешь что такое роутинг и зачем это надо, значит у тебя ещё нет опыта в разработке SPA.Я не обязан знать все названия.
hVosttАлексей Кпропущено...
Что это? Наверное, это есть в велосипеде

получаешь данные, оборачиваешь во вью-модели? отправляешь, сериализуешь вью-модель в JSON?Всё что для этого нужно пишется за 5 минут.

hVosttэто значит, что тебе на надо думать над основной архитектурой, она уже есть из коробки. сразу пишешь модели, логику и шаблоны. не паришься как это всё организовать, даже структуру папок и файлов SPA фреймворк уже предусматривает.Да.

hVosttдля стороннего разработчика на типичной архитектуре фреймворка это означает возможность очень легко и быстро влиться в разработкуТам масштабы не те. Изучается за неделю в худшем случае. В отличие от ангуларов и прочих.

hVostt, без вникания в дебри больной, безумной фантазии велосипедостроя (уж поверь мне, я ковырял твой Simple Solution Project, и самому ненавистному врагу не пожелаю поддерживать это или нечто подобное),Если взялся критиковать, то нужны конкретные замечания. Общих слов не достаточно.

hVostt а с фантазией обычно у авторов всё впорядке, не надо ни пить, ни курить, достаточно редактора кода Согласен, фантазия у авторов всяких Prism-ов и ангуларов безгранична.

hVosttАлексей КТы программист, или где?

Я командный программист в первую очередь, для меня обеспечение комфортной разработки/сопровождения в команде в абсолютном приоритете. Что означает НЕТ велосипедам там, где можно обойтись без них. Чем меньше велосипедов, тем проще сопровождать и разрабатывать.Согласен, если в команде нет нормальных разработчиков, способных разработать инструмент "под себя", то да, велосипедами лучше не заниматься.

hVosttАлексей КНормальных нет.

У всех фатальный недостаток? Раньше не было, может теперь уже и есть, но мне уже не актуально.
...
Рейтинг: 0 / 0
Single page aplication
    #38934512
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К, гы, захотелось взглянуть на твой код :)
...
Рейтинг: 0 / 0
Single page aplication
    #38934519
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lolka1Сам не разработчик, но тут приспичило кое-что напрогать..

hVosttРоутинг?
Модули?
DI?
Фабрики?
Модели?
REST/API?
Контроллеры?
Костная архитектура?

Нифига нет. Называется, засучивай рукава и пили. Если же хочется сосредоточиться на решении задачи, а не написании очередного велосипеда, надо брать нормальный SPA-фреймфорк и не выёживаться
...
Рейтинг: 0 / 0
Single page aplication
    #38934536
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей К, гы, захотелось взглянуть на твой код :)
Пожалуйста
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
export = Index;
import Roles = require("CurrentUser/Roles");
import HomeIndex = require("Home/Index");
import FavoritesSelector = require("Favorites/FavoritesSelector");

class Index extends ssp.IndexForm {
    directions = new ssp.DataSource({ url: "api/MessageTaskApi/GetDirections" });
    categories = new ssp.DataSource({ url: "api/MessageTaskApi/GetCategories" });
    projects = new ssp.DataSource({ url: "api/MessageTaskApi/GetProjects" });
    states = new ssp.DataSource({ url: "api/MessageTaskApi/GetStates" });
    favorites = new ssp.DataSource({ url: "api/MessageTaskApi/GetFavorites" });
    roles = new Roles();
    table: ssp.Table;

    constructor(parameters?) {
        super({
            templateUrl: ssp.url.getViewUrl("MessageTask/Index"),
            indexApiController: "api/MessageTaskApi",
            excelApiController: "api/MessageTaskExcelApi",
            editApiController: "api/MessageTaskEditApi",
            getRowID: row => row.ID,
            getRowName: row => row.Subject,
            dataConverter: data => {
                $.each(data.PageRows || [], (i, row) => {
                    row.IsTaskNotReaded = ko.observable(row.IsTaskNotReaded);
                });
            },
            filterConverter: filter => {
                var p = parameters || {};

                if (p.notReaded) {
                    filter.FilterType(0); // Текущие задачи
                    filter.F0_Category(1); // Непрочитанные
                    filter.F0_Direction(0); // Все задачи                    
                }
            }
        });

        var columns = [
            new ssp.TableColumn({
                header: "Тема",
                cellClass: row => "taskContent",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => {
                    var c = new ssp.Control({ templateName: "messageTask-index-taskContent-template" });
                    c["data"] = row;
                    c["parent"] = this;
                    return c;
                }                
            }),
            new ssp.TableColumn({
                header: "Дата",
                tooltip: "Дата постановки задачи или последнего комментария.",
                propertyName: "ActivityDate",
                formatter: ssp.formatters.dateTime,
                cellClass: row => "auto-width"
            }),
            new ssp.TableColumn({
                header: "Постановщик",
                cellClass: row => "auto-width",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => {
                    var member = row.Sender;
                    return new ssp.Label(member.Name, member.IsMe ? ssp.Brands.Default : null);
                }
            }),
            new ssp.TableColumn({
                header: "Исполнитель",
                cellClass: row => "auto-width",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => {
                    var member = row.Recipient;
                    return new ssp.Label(member.Name, member.IsMe ? ssp.Brands.Default : null);
                }
            }),
            new ssp.TableColumn({
                header: "Состояние",
                cellClass: row => "auto-width",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => new ssp.Label(row.CurrentStateStr, row.IsActive ? ssp.Brands.Success : ssp.Brands.Default)
            }),
            new ssp.TableColumn({
                header: "Проект",
                propertyName: "ProjectStr"
            })
        ];

        $.each(columns, (i, column) => {
            column.canSort = false;
        });

        var contextMenu = new ssp.GroupMenuItem({
            template: ssp.groupMenuItemTemplates.button,
            items: [
                new ssp.UrlMenuItem({
                    header: "Подробно",
                    url: row => row ? this.getDetailUrl(row) : ""
                }),
                new ssp.FuncMenuItem({
                    header: row => row ? row.IsTaskNotReaded() ? "Пометить как прочтённое" : "Пометить как непрочтённое" : "",
                    func: row => { this.inverseIsTaskReaded(row); },
                    isEnabled: row => row && row.MustReadMessage
                }),
                new ssp.SeparatorMenuItem({
                    isVisible: () =>
                        this.roles.isInRole(this.roles.appRoles.message_task) ||
                        this.roles.isInRole(this.roles.appRoles.message_task_delete)
                }),
                new ssp.UrlMenuItem({
                    header: "Изменить",
                    url: row => row ? ssp.url.getDocUrl("MessageTask/Edit", { id: this.getRowID(row) }) : "",
                    isVisible: () => this.roles.isInRole(this.roles.appRoles.message_task),
                    isEnabled: row => row && row.CanChangeMessage
                }),
                new ssp.FuncMenuItem({
                    header: "Удалить",
                    func: row => { this.delete(row); },
                    isVisible: () => this.roles.isInRole(this.roles.appRoles.message_task_delete),
                    isEnabled: row => row && row.CanChangeMessage
                }),
                new ssp.SeparatorMenuItem(),
                new ssp.FuncMenuItem({
                    header: "Добавить в избранное",
                    func: row => { this.addToFavorite(row); }
                }),
                new ssp.FuncMenuItem({
                    header: "Удалить из избранного",
                    func: row => { this.deleteFromFavorite(row); },
                    isEnabled: () => {
                        var filter = this.filter.result();
                        return filter && filter.FilterType() == 1 /*Избранное*/ && filter.F1_FavID()
                    }
                })
            ]
        });

        this.table = new ssp.Table({
            addUrl: ssp.url.getDocUrl("MessageTask/Edit"),
            isAddVisible: () => this.roles.isInRole(this.roles.appRoles.message_task),
            dataSource: this.data,
            columns: columns,
            contextMenu: contextMenu
        });
    }

    getDetailUrl(row) {
        return ssp.url.getDocUrl("MessageTask/Detail", { id: row.ID });
    }

    inverseIsTaskReaded(row) {
        ssp.ajax
            .postJson("api/MessageApi/SetMessageReadedByID", { ID: this.getRowID(row), IsReaded: row.IsTaskNotReaded() })
            .done(() => {
                row.IsTaskNotReaded(!row.IsTaskNotReaded());
                HomeIndex.model.notReadedAlert.refresh();
                this.data.refreshImmediate();
            });
    }

    addToFavorite(row) {
        new FavoritesSelector()
            .select(selectedItem => {
                return ssp.ajax
                    .postJson("api/MessageTaskFavoritesApi/AddToFavorite", { TaskID: row.ID, FavID: selectedItem.ID })
                    .done(() => { this.data.refreshImmediate(); });
            });
    }

    deleteFromFavorite(row) {
        var favID = this.filter.result().F1_FavID();
        var favCaption = "";

        $.each(this.favorites.result() || [], (i, v) => {
            if (v.ID == favID) {
                favCaption = v.Caption;
                return false;
            }
        });

        var msg = "Задача будет исключена из категории избранного \"" + favCaption + "\". Продолжить?";

        ssp.commonDialogs
            .ask(msg)
            .done(() => {
                ssp.ajax
                    .postJson("api/MessageTaskFavoritesApi/DeleteFromFavorite", { TaskID: row.ID, FavID: favID })
                    .done(() => { this.data.refreshImmediate(); });
            });
    }
}

...
Рейтинг: 0 / 0
Single page aplication
    #38934539
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЯ не обязан знать все названия.

Нет конечно.

Алексей КТам масштабы не те. Изучается за неделю в худшем случае. В отличие от ангуларов и прочих.

Ну дык зачем ты советуешь людЯм заниматься велосепедостроительством? Человек, изучивший хорошо Ангуляр найдёт работу максимум на неделю, и ЗП будет не обижен. А знающий только нокаут, вообще сомневаюсь что хоть что-то найдёт... Такие знания нафиг никому не упёрлись.

Алексей КЕсли взялся критиковать, то нужны конкретные замечания. Общих слов не достаточно.

Я не критикую, я привожу пример того, что получается, когда одиночки делают свою архитектуру. Ты бы ещё больше слоёв там добавил, а то явно их недостаточно Это не критика, это факт, так оно обычно и получается.

Алексей КСогласен, фантазия у авторов всяких Prism-ов и ангуларов безгранична.

Ангуляр блетсящий пример, кстати. Вроде и команда дикая и поддержка гугловская и коммьюнити огромное, но на выходе, по крайне мере ветки 1.x получается весьма далёкая от идеала архитектура. Мне не нравится 1.x, очень много претензий. Но однако при всё при этом даже она в плюсе перед велосипедами в 95% случаев.

2.x ещё подробно не ковырял, но судя по поверхностному обзору, работа над ошибками была проведена существенная, похоже эта версия мне даже понравится.
...
Рейтинг: 0 / 0
Single page aplication
    #38934553
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей КТам масштабы не те. Изучается за неделю в худшем случае. В отличие от ангуларов и прочих.

Ну дык зачем ты советуешь людЯм заниматься велосепедостроительством?Я никому ничего не советую. Я делюсь своим мнением.
hVosttЧеловек, изучивший хорошо Ангуляр найдёт работу максимум на неделю, и ЗП будет не обижен.Ангулар будет изучен при необходимости максимум за неделю. Но зачем мне это?
hVosttА знающий только нокаут, вообще сомневаюсь что хоть что-то найдёт... Такие знания нафиг никому не упёрлись.Если контора отличает кандидатов по знанию "ангуларов", то её кадровая политика бездарна, делать в такой конторе нечего.
hVosttАлексей КЕсли взялся критиковать, то нужны конкретные замечания. Общих слов не достаточно.

Я не критикую, я привожу пример того, что получается, когда одиночки делают свою архитектуру.А меж тем эта архитектура прекрасно показала себя на практике. Да и архитектуры там как-таковой практически нет. Всё базируется на стандартной архитектуре приложений под WPF/WCF/EF, с некоторым расширениями.
hVosttТы бы ещё больше слоёв там добавил, а то явно их недостаточно Это не критика, это факт, так оно обычно и получается.Фактов не увидел.
hVosttАлексей КСогласен, фантазия у авторов всяких Prism-ов и ангуларов безгранична.

Ангуляр блетсящий пример, кстати. Вроде и команда дикая и поддержка гугловская и коммьюнити огромное, но на выходе, по крайне мере ветки 1.x получается весьма далёкая от идеала архитектура. Мне не нравится 1.x, очень много претензий. Но однако при всё при этом даже она в плюсе перед велосипедами в 95% случаев.

2.x ещё подробно не ковырял, но судя по поверхностному обзору, работа над ошибками была проведена существенная, похоже эта версия мне даже понравится.Через год будет версия 3.x, потом 4.x, наверняка без обратной совместимости. Потом всё успешно загнётся, когда у гугла появится новая игрушка.
...
Рейтинг: 0 / 0
Single page aplication
    #38934579
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAАлексей К, гы, захотелось взглянуть на твой код :)
Пожалуйста
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
export = Index;
import Roles = require("CurrentUser/Roles");
import HomeIndex = require("Home/Index");
import FavoritesSelector = require("Favorites/FavoritesSelector");

class Index extends ssp.IndexForm {
    directions = new ssp.DataSource({ url: "api/MessageTaskApi/GetDirections" });
    categories = new ssp.DataSource({ url: "api/MessageTaskApi/GetCategories" });
    projects = new ssp.DataSource({ url: "api/MessageTaskApi/GetProjects" });
    states = new ssp.DataSource({ url: "api/MessageTaskApi/GetStates" });
    favorites = new ssp.DataSource({ url: "api/MessageTaskApi/GetFavorites" });
    roles = new Roles();
    table: ssp.Table;

    constructor(parameters?) {
        super({
            templateUrl: ssp.url.getViewUrl("MessageTask/Index"),
            indexApiController: "api/MessageTaskApi",
            excelApiController: "api/MessageTaskExcelApi",
            editApiController: "api/MessageTaskEditApi",
            getRowID: row => row.ID,
            getRowName: row => row.Subject,
            dataConverter: data => {
                $.each(data.PageRows || [], (i, row) => {
                    row.IsTaskNotReaded = ko.observable(row.IsTaskNotReaded);
                });
            },
            filterConverter: filter => {
                var p = parameters || {};

                if (p.notReaded) {
                    filter.FilterType(0); // Текущие задачи
                    filter.F0_Category(1); // Непрочитанные
                    filter.F0_Direction(0); // Все задачи                    
                }
            }
        });

        var columns = [
            new ssp.TableColumn({
                header: "Тема",
                cellClass: row => "taskContent",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => {
                    var c = new ssp.Control({ templateName: "messageTask-index-taskContent-template" });
                    c["data"] = row;
                    c["parent"] = this;
                    return c;
                }                
            }),
            new ssp.TableColumn({
                header: "Дата",
                tooltip: "Дата постановки задачи или последнего комментария.",
                propertyName: "ActivityDate",
                formatter: ssp.formatters.dateTime,
                cellClass: row => "auto-width"
            }),
            new ssp.TableColumn({
                header: "Постановщик",
                cellClass: row => "auto-width",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => {
                    var member = row.Sender;
                    return new ssp.Label(member.Name, member.IsMe ? ssp.Brands.Default : null);
                }
            }),
            new ssp.TableColumn({
                header: "Исполнитель",
                cellClass: row => "auto-width",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => {
                    var member = row.Recipient;
                    return new ssp.Label(member.Name, member.IsMe ? ssp.Brands.Default : null);
                }
            }),
            new ssp.TableColumn({
                header: "Состояние",
                cellClass: row => "auto-width",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => new ssp.Label(row.CurrentStateStr, row.IsActive ? ssp.Brands.Success : ssp.Brands.Default)
            }),
            new ssp.TableColumn({
                header: "Проект",
                propertyName: "ProjectStr"
            })
        ];

        $.each(columns, (i, column) => {
            column.canSort = false;
        });

        var contextMenu = new ssp.GroupMenuItem({
            template: ssp.groupMenuItemTemplates.button,
            items: [
                new ssp.UrlMenuItem({
                    header: "Подробно",
                    url: row => row ? this.getDetailUrl(row) : ""
                }),
                new ssp.FuncMenuItem({
                    header: row => row ? row.IsTaskNotReaded() ? "Пометить как прочтённое" : "Пометить как непрочтённое" : "",
                    func: row => { this.inverseIsTaskReaded(row); },
                    isEnabled: row => row && row.MustReadMessage
                }),
                new ssp.SeparatorMenuItem({
                    isVisible: () =>
                        this.roles.isInRole(this.roles.appRoles.message_task) ||
                        this.roles.isInRole(this.roles.appRoles.message_task_delete)
                }),
                new ssp.UrlMenuItem({
                    header: "Изменить",
                    url: row => row ? ssp.url.getDocUrl("MessageTask/Edit", { id: this.getRowID(row) }) : "",
                    isVisible: () => this.roles.isInRole(this.roles.appRoles.message_task),
                    isEnabled: row => row && row.CanChangeMessage
                }),
                new ssp.FuncMenuItem({
                    header: "Удалить",
                    func: row => { this.delete(row); },
                    isVisible: () => this.roles.isInRole(this.roles.appRoles.message_task_delete),
                    isEnabled: row => row && row.CanChangeMessage
                }),
                new ssp.SeparatorMenuItem(),
                new ssp.FuncMenuItem({
                    header: "Добавить в избранное",
                    func: row => { this.addToFavorite(row); }
                }),
                new ssp.FuncMenuItem({
                    header: "Удалить из избранного",
                    func: row => { this.deleteFromFavorite(row); },
                    isEnabled: () => {
                        var filter = this.filter.result();
                        return filter && filter.FilterType() == 1 /*Избранное*/ && filter.F1_FavID()
                    }
                })
            ]
        });

        this.table = new ssp.Table({
            addUrl: ssp.url.getDocUrl("MessageTask/Edit"),
            isAddVisible: () => this.roles.isInRole(this.roles.appRoles.message_task),
            dataSource: this.data,
            columns: columns,
            contextMenu: contextMenu
        });
    }

    getDetailUrl(row) {
        return ssp.url.getDocUrl("MessageTask/Detail", { id: row.ID });
    }

    inverseIsTaskReaded(row) {
        ssp.ajax
            .postJson("api/MessageApi/SetMessageReadedByID", { ID: this.getRowID(row), IsReaded: row.IsTaskNotReaded() })
            .done(() => {
                row.IsTaskNotReaded(!row.IsTaskNotReaded());
                HomeIndex.model.notReadedAlert.refresh();
                this.data.refreshImmediate();
            });
    }

    addToFavorite(row) {
        new FavoritesSelector()
            .select(selectedItem => {
                return ssp.ajax
                    .postJson("api/MessageTaskFavoritesApi/AddToFavorite", { TaskID: row.ID, FavID: selectedItem.ID })
                    .done(() => { this.data.refreshImmediate(); });
            });
    }

    deleteFromFavorite(row) {
        var favID = this.filter.result().F1_FavID();
        var favCaption = "";

        $.each(this.favorites.result() || [], (i, v) => {
            if (v.ID == favID) {
                favCaption = v.Caption;
                return false;
            }
        });

        var msg = "Задача будет исключена из категории избранного \"" + favCaption + "\". Продолжить?";

        ssp.commonDialogs
            .ask(msg)
            .done(() => {
                ssp.ajax
                    .postJson("api/MessageTaskFavoritesApi/DeleteFromFavorite", { TaskID: row.ID, FavID: favID })
                    .done(() => { this.data.refreshImmediate(); });
            });
    }
}

Очередной Smart UI.
...
Рейтинг: 0 / 0
25 сообщений из 73, страница 1 из 3
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Single page aplication
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]