AnnouncementComment ve AnnouncementLike sistemi dahil edildi.
This commit is contained in:
parent
75381731b6
commit
56233c54df
21 changed files with 1419 additions and 20 deletions
|
|
@ -19,5 +19,19 @@ public class AnnouncementDto : FullAuditedEntityDto<Guid>
|
||||||
public DateTime? ExpiryDate { get; set; }
|
public DateTime? ExpiryDate { get; set; }
|
||||||
public bool IsPinned { get; set; }
|
public bool IsPinned { get; set; }
|
||||||
public int ViewCount { get; set; }
|
public int ViewCount { get; set; }
|
||||||
|
public int Likes { get; set; }
|
||||||
|
public bool IsLiked { get; set; }
|
||||||
public string Attachments { get; set; } = string.Empty;
|
public string Attachments { get; set; } = string.Empty;
|
||||||
|
public System.Collections.Generic.List<AnnouncementCommentDto> Comments { get; set; } = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
public class AnnouncementCommentDto
|
||||||
|
{
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
public Guid AnnouncementId { get; set; }
|
||||||
|
public Guid UserId { get; set; }
|
||||||
|
public UserInfoViewModel? User { get; set; }
|
||||||
|
public string Content { get; set; } = string.Empty;
|
||||||
|
public int Likes { get; set; }
|
||||||
|
public DateTime CreationTime { get; set; }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,9 @@ public interface IIntranetAppService : IApplicationService
|
||||||
Task<SocialCommentDto> CommentSocialPostAsync(System.Guid id, string content);
|
Task<SocialCommentDto> CommentSocialPostAsync(System.Guid id, string content);
|
||||||
Task VoteSocialPollAsync(System.Guid postId, System.Guid optionId);
|
Task VoteSocialPollAsync(System.Guid postId, System.Guid optionId);
|
||||||
Task IncrementAnnouncementViewCountAsync(System.Guid id);
|
Task IncrementAnnouncementViewCountAsync(System.Guid id);
|
||||||
|
Task<List<AnnouncementCommentDto>> GetAnnouncementCommentsAsync(Guid announcementId);
|
||||||
|
Task<AnnouncementCommentDto> CreateAnnouncementCommentAsync(Guid announcementId, string content);
|
||||||
|
Task<AnnouncementDto> LikeAnnouncementAsync(Guid id);
|
||||||
Task<List<EventCommentDto>> GetEventCommentsAsync(Guid eventId);
|
Task<List<EventCommentDto>> GetEventCommentsAsync(Guid eventId);
|
||||||
Task<EventCommentDto> CreateEventCommentAsync(Guid eventId, string content);
|
Task<EventCommentDto> CreateEventCommentAsync(Guid eventId, string content);
|
||||||
Task<EventDto> LikeEventAsync(Guid id);
|
Task<EventDto> LikeEventAsync(Guid id);
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,8 @@ public class IntranetAppService : PlatformAppService, IIntranetAppService
|
||||||
private readonly IRepository<SocialPollOption, Guid> _socialPollOptionRepository;
|
private readonly IRepository<SocialPollOption, Guid> _socialPollOptionRepository;
|
||||||
private readonly IRepository<EventComment, Guid> _eventCommentRepository;
|
private readonly IRepository<EventComment, Guid> _eventCommentRepository;
|
||||||
private readonly IRepository<EventLike, Guid> _eventLikeRepository;
|
private readonly IRepository<EventLike, Guid> _eventLikeRepository;
|
||||||
|
private readonly IRepository<AnnouncementComment, Guid> _announcementCommentRepository;
|
||||||
|
private readonly IRepository<AnnouncementLike, Guid> _announcementLikeRepository;
|
||||||
|
|
||||||
public IntranetAppService(
|
public IntranetAppService(
|
||||||
ICurrentTenant currentTenant,
|
ICurrentTenant currentTenant,
|
||||||
|
|
@ -67,7 +69,9 @@ public class IntranetAppService : PlatformAppService, IIntranetAppService
|
||||||
IRepository<SocialMedia, Guid> socialMediaRepository,
|
IRepository<SocialMedia, Guid> socialMediaRepository,
|
||||||
IRepository<SocialPollOption, Guid> socialPollOptionRepository,
|
IRepository<SocialPollOption, Guid> socialPollOptionRepository,
|
||||||
IRepository<EventComment, Guid> eventCommentRepository,
|
IRepository<EventComment, Guid> eventCommentRepository,
|
||||||
IRepository<EventLike, Guid> eventLikeRepository
|
IRepository<EventLike, Guid> eventLikeRepository,
|
||||||
|
IRepository<AnnouncementComment, Guid> announcementCommentRepository,
|
||||||
|
IRepository<AnnouncementLike, Guid> announcementLikeRepository
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
_currentTenant = currentTenant;
|
_currentTenant = currentTenant;
|
||||||
|
|
@ -90,6 +94,8 @@ public class IntranetAppService : PlatformAppService, IIntranetAppService
|
||||||
_socialPollOptionRepository = socialPollOptionRepository;
|
_socialPollOptionRepository = socialPollOptionRepository;
|
||||||
_eventCommentRepository = eventCommentRepository;
|
_eventCommentRepository = eventCommentRepository;
|
||||||
_eventLikeRepository = eventLikeRepository;
|
_eventLikeRepository = eventLikeRepository;
|
||||||
|
_announcementCommentRepository = announcementCommentRepository;
|
||||||
|
_announcementLikeRepository = announcementLikeRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
[UnitOfWork]
|
[UnitOfWork]
|
||||||
|
|
@ -368,21 +374,66 @@ public class IntranetAppService : PlatformAppService, IIntranetAppService
|
||||||
var announcements = await _announcementRepository.GetListAsync();
|
var announcements = await _announcementRepository.GetListAsync();
|
||||||
var announcementDtos = new List<AnnouncementDto>();
|
var announcementDtos = new List<AnnouncementDto>();
|
||||||
|
|
||||||
|
if (announcements.Count == 0)
|
||||||
|
return announcementDtos;
|
||||||
|
|
||||||
|
var announcementIds = announcements.Select(a => a.Id).ToList();
|
||||||
|
|
||||||
|
var commentsQueryable = await _announcementCommentRepository.GetQueryableAsync();
|
||||||
|
var allComments = await AsyncExecuter.ToListAsync(
|
||||||
|
commentsQueryable.Where(c => announcementIds.Contains(c.AnnouncementId)).OrderBy(c => c.CreationTime)
|
||||||
|
);
|
||||||
|
|
||||||
|
var likesQueryable = await _announcementLikeRepository.GetQueryableAsync();
|
||||||
|
var allLikes = await AsyncExecuter.ToListAsync(
|
||||||
|
likesQueryable.Where(l => announcementIds.Contains(l.AnnouncementId))
|
||||||
|
);
|
||||||
|
|
||||||
|
var likedAnnouncementIds = allLikes
|
||||||
|
.Where(l => l.UserId == CurrentUser.Id)
|
||||||
|
.Select(l => l.AnnouncementId)
|
||||||
|
.ToHashSet();
|
||||||
|
|
||||||
|
var userIds = announcements
|
||||||
|
.Where(a => a.UserId.HasValue)
|
||||||
|
.Select(a => a.UserId!.Value)
|
||||||
|
.Union(allComments.Select(c => c.UserId))
|
||||||
|
.Distinct()
|
||||||
|
.ToList();
|
||||||
|
|
||||||
var (departmentDict, jobPositionDict) = await GetUserLookupDictionariesAsync();
|
var (departmentDict, jobPositionDict) = await GetUserLookupDictionariesAsync();
|
||||||
var fallbackUser = await GetDashboardFallbackUserAsync(departmentDict, jobPositionDict);
|
var fallbackUser = await GetDashboardFallbackUserAsync(departmentDict, jobPositionDict);
|
||||||
|
var users = await _identityUserRepository.GetListAsync();
|
||||||
|
var userDict = users
|
||||||
|
.Where(u => userIds.Contains(u.Id))
|
||||||
|
.ToDictionary(u => u.Id, u => MapUserInfoViewModel(u, departmentDict, jobPositionDict));
|
||||||
|
|
||||||
|
var commentsByAnnouncement = allComments
|
||||||
|
.GroupBy(c => c.AnnouncementId)
|
||||||
|
.ToDictionary(g => g.Key, g => g.ToList());
|
||||||
|
|
||||||
foreach (var announcement in announcements)
|
foreach (var announcement in announcements)
|
||||||
{
|
{
|
||||||
var dto = ObjectMapper.Map<Announcement, AnnouncementDto>(announcement);
|
var dto = ObjectMapper.Map<Announcement, AnnouncementDto>(announcement);
|
||||||
|
|
||||||
if (announcement.UserId.HasValue)
|
if (announcement.UserId.HasValue && userDict.TryGetValue(announcement.UserId.Value, out var announcementUser))
|
||||||
{
|
{
|
||||||
var user = await _identityUserRepository.FindAsync(announcement.UserId.Value);
|
dto.User = announcementUser;
|
||||||
if (user != null)
|
}
|
||||||
|
|
||||||
|
dto.IsLiked = likedAnnouncementIds.Contains(announcement.Id);
|
||||||
|
dto.Comments = commentsByAnnouncement.TryGetValue(announcement.Id, out var comments)
|
||||||
|
? comments.Select(c => new AnnouncementCommentDto
|
||||||
{
|
{
|
||||||
dto.User = MapUserInfoViewModel(user, departmentDict, jobPositionDict);
|
Id = c.Id,
|
||||||
}
|
AnnouncementId = c.AnnouncementId,
|
||||||
}
|
UserId = c.UserId,
|
||||||
|
User = userDict.TryGetValue(c.UserId, out var commentUser) ? commentUser : null,
|
||||||
|
Content = c.Content,
|
||||||
|
Likes = c.Likes,
|
||||||
|
CreationTime = c.CreationTime
|
||||||
|
}).ToList()
|
||||||
|
: [];
|
||||||
|
|
||||||
dto.User ??= fallbackUser;
|
dto.User ??= fallbackUser;
|
||||||
announcementDtos.Add(dto);
|
announcementDtos.Add(dto);
|
||||||
|
|
@ -391,6 +442,100 @@ public class IntranetAppService : PlatformAppService, IIntranetAppService
|
||||||
return announcementDtos;
|
return announcementDtos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<List<AnnouncementCommentDto>> GetAnnouncementCommentsAsync(Guid announcementId)
|
||||||
|
{
|
||||||
|
var commentsQueryable = await _announcementCommentRepository.GetQueryableAsync();
|
||||||
|
var comments = await AsyncExecuter.ToListAsync(
|
||||||
|
commentsQueryable.Where(c => c.AnnouncementId == announcementId).OrderBy(c => c.CreationTime)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (comments.Count == 0)
|
||||||
|
return [];
|
||||||
|
|
||||||
|
var userIds = comments.Select(c => c.UserId).Distinct().ToList();
|
||||||
|
var (departmentDict, jobPositionDict) = await GetUserLookupDictionariesAsync();
|
||||||
|
var users = await _identityUserRepository.GetListAsync();
|
||||||
|
var userDict = users
|
||||||
|
.Where(u => userIds.Contains(u.Id))
|
||||||
|
.ToDictionary(u => u.Id, u => MapUserInfoViewModel(u, departmentDict, jobPositionDict));
|
||||||
|
|
||||||
|
return comments.Select(c => new AnnouncementCommentDto
|
||||||
|
{
|
||||||
|
Id = c.Id,
|
||||||
|
AnnouncementId = c.AnnouncementId,
|
||||||
|
UserId = c.UserId,
|
||||||
|
User = userDict.TryGetValue(c.UserId, out var u) ? u : null,
|
||||||
|
Content = c.Content,
|
||||||
|
Likes = c.Likes,
|
||||||
|
CreationTime = c.CreationTime
|
||||||
|
}).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<AnnouncementCommentDto> CreateAnnouncementCommentAsync(Guid announcementId, string content)
|
||||||
|
{
|
||||||
|
var comment = new AnnouncementComment
|
||||||
|
{
|
||||||
|
AnnouncementId = announcementId,
|
||||||
|
UserId = CurrentUser.Id ?? Guid.Empty,
|
||||||
|
Content = content,
|
||||||
|
Likes = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
comment = await _announcementCommentRepository.InsertAsync(comment, autoSave: true);
|
||||||
|
|
||||||
|
var (departmentDict, jobPositionDict) = await GetUserLookupDictionariesAsync();
|
||||||
|
var user = await _identityUserRepository.FindAsync(comment.UserId);
|
||||||
|
var userViewModel = user != null ? MapUserInfoViewModel(user, departmentDict, jobPositionDict) : null;
|
||||||
|
|
||||||
|
return new AnnouncementCommentDto
|
||||||
|
{
|
||||||
|
Id = comment.Id,
|
||||||
|
AnnouncementId = comment.AnnouncementId,
|
||||||
|
UserId = comment.UserId,
|
||||||
|
User = userViewModel,
|
||||||
|
Content = comment.Content,
|
||||||
|
Likes = comment.Likes,
|
||||||
|
CreationTime = comment.CreationTime
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost("api/app/intranet/like-announcement")]
|
||||||
|
public async Task<AnnouncementDto> LikeAnnouncementAsync(Guid id)
|
||||||
|
{
|
||||||
|
var announcement = await _announcementRepository.GetAsync(id);
|
||||||
|
|
||||||
|
var likeQueryable = await _announcementLikeRepository.GetQueryableAsync();
|
||||||
|
var existingLike = await AsyncExecuter.FirstOrDefaultAsync(
|
||||||
|
likeQueryable.Where(l => l.AnnouncementId == id && l.UserId == CurrentUser.Id));
|
||||||
|
|
||||||
|
bool isNowLiked;
|
||||||
|
if (existingLike != null)
|
||||||
|
{
|
||||||
|
await _announcementLikeRepository.DeleteAsync(existingLike.Id);
|
||||||
|
announcement.Likes = Math.Max(0, announcement.Likes - 1);
|
||||||
|
isNowLiked = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await _announcementLikeRepository.InsertAsync(new AnnouncementLike(Guid.NewGuid())
|
||||||
|
{
|
||||||
|
AnnouncementId = id,
|
||||||
|
UserId = CurrentUser.Id,
|
||||||
|
});
|
||||||
|
announcement.Likes++;
|
||||||
|
isNowLiked = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
await _announcementRepository.UpdateAsync(announcement, autoSave: true);
|
||||||
|
|
||||||
|
return new AnnouncementDto
|
||||||
|
{
|
||||||
|
Id = announcement.Id,
|
||||||
|
Likes = announcement.Likes,
|
||||||
|
IsLiked = isNowLiked,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
private async Task<List<SurveyDto>> GetSurveysAsync()
|
private async Task<List<SurveyDto>> GetSurveysAsync()
|
||||||
{
|
{
|
||||||
var queryable = await _surveyRepository.GetQueryableAsync();
|
var queryable = await _surveyRepository.GetQueryableAsync();
|
||||||
|
|
|
||||||
|
|
@ -6674,7 +6674,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"resourceName": "Platform",
|
"resourceName": "Platform",
|
||||||
"key": "App.Intranet.Events.EventComment",
|
"key": "App.Intranet.Events.NoComment",
|
||||||
"tr": "Henüz yorum yok. İlk yorumu sen yap!",
|
"tr": "Henüz yorum yok. İlk yorumu sen yap!",
|
||||||
"en": "No comments yet. Be the first to comment!"
|
"en": "No comments yet. Be the first to comment!"
|
||||||
},
|
},
|
||||||
|
|
@ -6720,6 +6720,12 @@
|
||||||
"tr": "Etkinlik Beğenileri",
|
"tr": "Etkinlik Beğenileri",
|
||||||
"en": "Event Likes"
|
"en": "Event Likes"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"resourceName": "Platform",
|
||||||
|
"key": "App.Intranet.Events.EventComment",
|
||||||
|
"tr": "Etkinlik Yorumları",
|
||||||
|
"en": "Event Comments"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"resourceName": "Platform",
|
"resourceName": "Platform",
|
||||||
"key": "App.Hr.Training",
|
"key": "App.Hr.Training",
|
||||||
|
|
@ -13484,6 +13490,30 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"LanguageFieldTitles": [
|
"LanguageFieldTitles": [
|
||||||
|
{
|
||||||
|
"resourceName": "Platform",
|
||||||
|
"key": "App.Intranet.Announcement.AnnouncementLike",
|
||||||
|
"en": "Announcements Like",
|
||||||
|
"tr": "Duyuru Beğenileri"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"resourceName": "Platform",
|
||||||
|
"key": "App.Intranet.Announcement.AnnouncementComment",
|
||||||
|
"en": "Announcements Comments",
|
||||||
|
"tr": "Duyuru Yorumları"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"resourceName": "Platform",
|
||||||
|
"key": "App.Listform.ListformField.AnnouncementId",
|
||||||
|
"en": "Announcement Number",
|
||||||
|
"tr": "Duyuru No"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"resourceName": "Platform",
|
||||||
|
"key": "App.Listform.ListformField.EventId",
|
||||||
|
"en": "Event Number",
|
||||||
|
"tr": "Olay No"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"resourceName": "Platform",
|
"resourceName": "Platform",
|
||||||
"key": "App.Listform.ListformField.Photos",
|
"key": "App.Listform.ListformField.Photos",
|
||||||
|
|
|
||||||
|
|
@ -84,6 +84,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
||||||
ColumnOptionJson = DefaultColumnOptionJson(),
|
ColumnOptionJson = DefaultColumnOptionJson(),
|
||||||
PermissionJson = DefaultPermissionJson(AbpIdentity.PermissionGroups.Create, AbpIdentity.PermissionGroups.Default, AbpIdentity.PermissionGroups.Update, AbpIdentity.PermissionGroups.Delete, AbpIdentity.PermissionGroups.Export, AbpIdentity.PermissionGroups.Import, AbpIdentity.PermissionGroups.Note),
|
PermissionJson = DefaultPermissionJson(AbpIdentity.PermissionGroups.Create, AbpIdentity.PermissionGroups.Default, AbpIdentity.PermissionGroups.Update, AbpIdentity.PermissionGroups.Delete, AbpIdentity.PermissionGroups.Export, AbpIdentity.PermissionGroups.Import, AbpIdentity.PermissionGroups.Note),
|
||||||
PagerOptionJson = DefaultPagerOptionJson,
|
PagerOptionJson = DefaultPagerOptionJson,
|
||||||
|
InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(),
|
||||||
EditingOptionJson = DefaultEditingOptionJson(listFormName, 600, 350, true, true, true, true, false),
|
EditingOptionJson = DefaultEditingOptionJson(listFormName, 600, 350, true, true, true, true, false),
|
||||||
EditingFormJson = JsonSerializer.Serialize(new List<EditingFormDto>()
|
EditingFormJson = JsonSerializer.Serialize(new List<EditingFormDto>()
|
||||||
{
|
{
|
||||||
|
|
@ -215,6 +216,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
||||||
PermissionJson = DefaultPermissionJson(AbpIdentity.Permissions.Create, listFormName, AbpIdentity.Permissions.Update, AbpIdentity.Permissions.Delete, AbpIdentity.Permissions.Export, AbpIdentity.Permissions.Import, AbpIdentity.Permissions.Note),
|
PermissionJson = DefaultPermissionJson(AbpIdentity.Permissions.Create, listFormName, AbpIdentity.Permissions.Update, AbpIdentity.Permissions.Delete, AbpIdentity.Permissions.Export, AbpIdentity.Permissions.Import, AbpIdentity.Permissions.Note),
|
||||||
PagerOptionJson = DefaultPagerOptionJson,
|
PagerOptionJson = DefaultPagerOptionJson,
|
||||||
TreeOptionJson = DefaultTreeOptionJson("Name", "ParentName", true),
|
TreeOptionJson = DefaultTreeOptionJson("Name", "ParentName", true),
|
||||||
|
InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(),
|
||||||
EditingOptionJson = DefaultEditingOptionJson(listFormName, 600, 600, true, true, true, true, false),
|
EditingOptionJson = DefaultEditingOptionJson(listFormName, 600, 600, true, true, true, true, false),
|
||||||
EditingFormJson = JsonSerializer.Serialize(new List<EditingFormDto>()
|
EditingFormJson = JsonSerializer.Serialize(new List<EditingFormDto>()
|
||||||
{
|
{
|
||||||
|
|
@ -2665,7 +2667,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Announncements
|
#region Announcement
|
||||||
listFormName = AppCodes.Intranet.Announcement;
|
listFormName = AppCodes.Intranet.Announcement;
|
||||||
if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName))
|
if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName))
|
||||||
{
|
{
|
||||||
|
|
@ -2676,7 +2678,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
||||||
PageSize = 10,
|
PageSize = 10,
|
||||||
ExportJson = DefaultExportJson,
|
ExportJson = DefaultExportJson,
|
||||||
IsSubForm = false,
|
IsSubForm = false,
|
||||||
ShowNote = false,
|
ShowNote = true,
|
||||||
LayoutJson = DefaultLayoutJson(),
|
LayoutJson = DefaultLayoutJson(),
|
||||||
CultureName = LanguageCodes.En,
|
CultureName = LanguageCodes.En,
|
||||||
ListFormCode = listFormName,
|
ListFormCode = listFormName,
|
||||||
|
|
@ -2703,7 +2705,7 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
||||||
DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.Announcement)),
|
DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.Announcement)),
|
||||||
DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(),
|
DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(),
|
||||||
PagerOptionJson = DefaultPagerOptionJson,
|
PagerOptionJson = DefaultPagerOptionJson,
|
||||||
EditingOptionJson = DefaultEditingOptionJson(listFormName, 750, 700, true, true, true, true, false),
|
EditingOptionJson = DefaultEditingOptionJson(listFormName, 750, 700, true, true, true, true, false, true),
|
||||||
InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(),
|
InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(),
|
||||||
EditingFormJson = JsonSerializer.Serialize(new List<EditingFormDto>()
|
EditingFormJson = JsonSerializer.Serialize(new List<EditingFormDto>()
|
||||||
{
|
{
|
||||||
|
|
@ -2724,6 +2726,32 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
||||||
{
|
{
|
||||||
new() { FieldName = "IsPinned", FieldDbType = DbType.Boolean, Value = "false", CustomValueType = FieldCustomValueTypeEnum.Value },
|
new() { FieldName = "IsPinned", FieldDbType = DbType.Boolean, Value = "false", CustomValueType = FieldCustomValueTypeEnum.Value },
|
||||||
new() { FieldName = "PublishDate", FieldDbType = DbType.Date, Value = "@NOW", CustomValueType = FieldCustomValueTypeEnum.CustomKey }
|
new() { FieldName = "PublishDate", FieldDbType = DbType.Date, Value = "@NOW", CustomValueType = FieldCustomValueTypeEnum.CustomKey }
|
||||||
|
}),
|
||||||
|
SubFormsJson = JsonSerializer.Serialize(new List<dynamic>() {
|
||||||
|
new {
|
||||||
|
TabType = ListFormTabTypeEnum.List,
|
||||||
|
TabTitle = AppCodes.Intranet.AnnouncementLike,
|
||||||
|
Code = AppCodes.Intranet.AnnouncementLike,
|
||||||
|
Relation = new List<dynamic>() {
|
||||||
|
new {
|
||||||
|
ParentFieldName = "Id",
|
||||||
|
DbType = DbType.Guid,
|
||||||
|
ChildFieldName = "AnnouncementId"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new {
|
||||||
|
TabType = ListFormTabTypeEnum.List,
|
||||||
|
TabTitle = AppCodes.Intranet.AnnouncementComment,
|
||||||
|
Code = AppCodes.Intranet.AnnouncementComment,
|
||||||
|
Relation = new List<dynamic>() {
|
||||||
|
new {
|
||||||
|
ParentFieldName = "Id",
|
||||||
|
DbType = DbType.Guid,
|
||||||
|
ChildFieldName = "AnnouncementId"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
@ -2910,6 +2938,234 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region AnnouncementLike
|
||||||
|
listFormName = AppCodes.Intranet.AnnouncementLike;
|
||||||
|
if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName))
|
||||||
|
{
|
||||||
|
var listForm = await _listFormRepository.InsertAsync(
|
||||||
|
new ListForm()
|
||||||
|
{
|
||||||
|
ListFormType = ListFormTypeEnum.List,
|
||||||
|
PageSize = 10,
|
||||||
|
ExportJson = DefaultExportJson,
|
||||||
|
IsSubForm = false,
|
||||||
|
ShowNote = false,
|
||||||
|
LayoutJson = DefaultLayoutJson(),
|
||||||
|
CultureName = LanguageCodes.En,
|
||||||
|
ListFormCode = listFormName,
|
||||||
|
Name = listFormName,
|
||||||
|
Title = listFormName,
|
||||||
|
DataSourceCode = SeedConsts.DataSources.DefaultCode,
|
||||||
|
IsTenant = true,
|
||||||
|
IsBranch = false,
|
||||||
|
IsOrganizationUnit = false,
|
||||||
|
Description = listFormName,
|
||||||
|
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||||
|
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.AnnouncementLike)),
|
||||||
|
KeyFieldName = "Id",
|
||||||
|
KeyFieldDbSourceType = DbType.Guid,
|
||||||
|
DefaultFilter = DefaultFilterJson,
|
||||||
|
SortMode = GridOptions.SortModeSingle,
|
||||||
|
FilterRowJson = DefaultFilterRowJson,
|
||||||
|
HeaderFilterJson = DefaultHeaderFilterJson,
|
||||||
|
SearchPanelJson = DefaultSearchPanelJson,
|
||||||
|
GroupPanelJson = DefaultGroupPanelJson,
|
||||||
|
SelectionJson = DefaultSelectionSingleJson,
|
||||||
|
ColumnOptionJson = DefaultColumnOptionJson(),
|
||||||
|
PermissionJson = DefaultPermissionJson(listFormName),
|
||||||
|
DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.AnnouncementLike)),
|
||||||
|
DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(),
|
||||||
|
PagerOptionJson = DefaultPagerOptionJson,
|
||||||
|
EditingOptionJson = DefaultEditingOptionJson(listFormName, 500, 250, true, true, true, true, false),
|
||||||
|
EditingFormJson = JsonSerializer.Serialize(new List<EditingFormDto>() {
|
||||||
|
new() { Order=1, ColCount=1, ColSpan=1, ItemType="group", Items=[
|
||||||
|
new EditingFormItemDto { Order = 1, DataField = "UserId", ColSpan = 1, EditorType2=EditorTypes.dxSelectBox },
|
||||||
|
]}
|
||||||
|
}),
|
||||||
|
InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
#region AnnouncementLike Fields
|
||||||
|
await _listFormFieldRepository.InsertManyAsync(new ListFormField[] {
|
||||||
|
new() {
|
||||||
|
ListFormCode = listForm.ListFormCode,
|
||||||
|
CultureName = LanguageCodes.En,
|
||||||
|
SourceDbType = DbType.Guid,
|
||||||
|
FieldName = "Id",
|
||||||
|
CaptionName = "App.Listform.ListformField.Id",
|
||||||
|
Width = 0,
|
||||||
|
ListOrderNo = 1,
|
||||||
|
Visible = false,
|
||||||
|
IsActive = true,
|
||||||
|
ValidationRuleJson = DefaultValidationRuleRequiredJson,
|
||||||
|
ColumnCustomizationJson = DefaultColumnCustomizationJson,
|
||||||
|
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
|
||||||
|
PivotSettingsJson = DefaultPivotSettingsJson
|
||||||
|
},
|
||||||
|
new() {
|
||||||
|
ListFormCode = listForm.ListFormCode,
|
||||||
|
CultureName = LanguageCodes.En,
|
||||||
|
SourceDbType = DbType.Guid,
|
||||||
|
FieldName = "UserId",
|
||||||
|
CaptionName = "App.Listform.ListformField.UserId",
|
||||||
|
Width = 0,
|
||||||
|
ListOrderNo = 2,
|
||||||
|
Visible = true,
|
||||||
|
IsActive = true,
|
||||||
|
AllowSearch = true,
|
||||||
|
LookupJson = JsonSerializer.Serialize(new LookupDto {
|
||||||
|
DataSourceType = UiLookupDataSourceTypeEnum.Query,
|
||||||
|
DisplayExpr = "Name",
|
||||||
|
ValueExpr = "Key",
|
||||||
|
LookupQuery = LookupQueryValues.UserValues
|
||||||
|
}),
|
||||||
|
ValidationRuleJson = DefaultValidationRuleRequiredJson,
|
||||||
|
ColumnCustomizationJson = DefaultColumnCustomizationJson,
|
||||||
|
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
|
||||||
|
PivotSettingsJson = DefaultPivotSettingsJson
|
||||||
|
},
|
||||||
|
new() {
|
||||||
|
ListFormCode = listForm.ListFormCode,
|
||||||
|
CultureName = LanguageCodes.En,
|
||||||
|
SourceDbType = DbType.Guid,
|
||||||
|
FieldName = "AnnouncementId",
|
||||||
|
CaptionName = "App.Listform.ListformField.AnnouncementId",
|
||||||
|
Width = 0,
|
||||||
|
ListOrderNo = 3,
|
||||||
|
Visible = false,
|
||||||
|
IsActive = true,
|
||||||
|
ColumnCustomizationJson = DefaultColumnCustomizationJson,
|
||||||
|
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
|
||||||
|
PivotSettingsJson = DefaultPivotSettingsJson
|
||||||
|
},
|
||||||
|
});
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region AnnouncementComment
|
||||||
|
listFormName = AppCodes.Intranet.AnnouncementComment;
|
||||||
|
if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName))
|
||||||
|
{
|
||||||
|
var listForm = await _listFormRepository.InsertAsync(
|
||||||
|
new ListForm()
|
||||||
|
{
|
||||||
|
ListFormType = ListFormTypeEnum.List,
|
||||||
|
PageSize = 10,
|
||||||
|
ExportJson = DefaultExportJson,
|
||||||
|
IsSubForm = false,
|
||||||
|
ShowNote = false,
|
||||||
|
LayoutJson = DefaultLayoutJson(),
|
||||||
|
CultureName = LanguageCodes.En,
|
||||||
|
ListFormCode = listFormName,
|
||||||
|
Name = listFormName,
|
||||||
|
Title = listFormName,
|
||||||
|
DataSourceCode = SeedConsts.DataSources.DefaultCode,
|
||||||
|
IsTenant = true,
|
||||||
|
IsBranch = false,
|
||||||
|
IsOrganizationUnit = false,
|
||||||
|
Description = listFormName,
|
||||||
|
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||||
|
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.AnnouncementComment)),
|
||||||
|
KeyFieldName = "Id",
|
||||||
|
KeyFieldDbSourceType = DbType.Guid,
|
||||||
|
DefaultFilter = DefaultFilterJson,
|
||||||
|
SortMode = GridOptions.SortModeSingle,
|
||||||
|
FilterRowJson = DefaultFilterRowJson,
|
||||||
|
HeaderFilterJson = DefaultHeaderFilterJson,
|
||||||
|
SearchPanelJson = DefaultSearchPanelJson,
|
||||||
|
GroupPanelJson = DefaultGroupPanelJson,
|
||||||
|
SelectionJson = DefaultSelectionSingleJson,
|
||||||
|
ColumnOptionJson = DefaultColumnOptionJson(),
|
||||||
|
PermissionJson = DefaultPermissionJson(listFormName),
|
||||||
|
DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.AnnouncementComment)),
|
||||||
|
DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(),
|
||||||
|
PagerOptionJson = DefaultPagerOptionJson,
|
||||||
|
EditingOptionJson = DefaultEditingOptionJson(listFormName, 500, 450, true, true, true, true, false),
|
||||||
|
EditingFormJson = JsonSerializer.Serialize(new List<EditingFormDto>() {
|
||||||
|
new() { Order=1, ColCount=1, ColSpan=1, ItemType="group", Items=[
|
||||||
|
new EditingFormItemDto { Order = 1, DataField = "UserId", ColSpan = 1, EditorType2=EditorTypes.dxSelectBox },
|
||||||
|
new EditingFormItemDto { Order = 2, DataField = "Content", ColSpan = 1, EditorType2=EditorTypes.dxTextArea },
|
||||||
|
]}
|
||||||
|
}),
|
||||||
|
InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
#region AnnouncementComment Fields
|
||||||
|
await _listFormFieldRepository.InsertManyAsync(new ListFormField[] {
|
||||||
|
new() {
|
||||||
|
ListFormCode = listForm.ListFormCode,
|
||||||
|
CultureName = LanguageCodes.En,
|
||||||
|
SourceDbType = DbType.Guid,
|
||||||
|
FieldName = "Id",
|
||||||
|
CaptionName = "App.Listform.ListformField.Id",
|
||||||
|
Width = 0,
|
||||||
|
ListOrderNo = 1,
|
||||||
|
Visible = false,
|
||||||
|
IsActive = true,
|
||||||
|
ValidationRuleJson = DefaultValidationRuleRequiredJson,
|
||||||
|
ColumnCustomizationJson = DefaultColumnCustomizationJson,
|
||||||
|
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
|
||||||
|
PivotSettingsJson = DefaultPivotSettingsJson
|
||||||
|
},
|
||||||
|
new() {
|
||||||
|
ListFormCode = listForm.ListFormCode,
|
||||||
|
CultureName = LanguageCodes.En,
|
||||||
|
SourceDbType = DbType.Guid,
|
||||||
|
FieldName = "UserId",
|
||||||
|
CaptionName = "App.Listform.ListformField.UserId",
|
||||||
|
Width = 0,
|
||||||
|
ListOrderNo = 2,
|
||||||
|
Visible = true,
|
||||||
|
IsActive = true,
|
||||||
|
AllowSearch = true,
|
||||||
|
LookupJson = JsonSerializer.Serialize(new LookupDto {
|
||||||
|
DataSourceType = UiLookupDataSourceTypeEnum.Query,
|
||||||
|
DisplayExpr = "Name",
|
||||||
|
ValueExpr = "Key",
|
||||||
|
LookupQuery = LookupQueryValues.UserValues
|
||||||
|
}),
|
||||||
|
ValidationRuleJson = DefaultValidationRuleRequiredJson,
|
||||||
|
ColumnCustomizationJson = DefaultColumnCustomizationJson,
|
||||||
|
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
|
||||||
|
PivotSettingsJson = DefaultPivotSettingsJson
|
||||||
|
},
|
||||||
|
new() {
|
||||||
|
ListFormCode = listForm.ListFormCode,
|
||||||
|
CultureName = LanguageCodes.En,
|
||||||
|
SourceDbType = DbType.String,
|
||||||
|
FieldName = "Content",
|
||||||
|
CaptionName = "App.Listform.ListformField.Content",
|
||||||
|
Width = 0,
|
||||||
|
ListOrderNo = 3,
|
||||||
|
Visible = true,
|
||||||
|
IsActive = true,
|
||||||
|
ValidationRuleJson = DefaultValidationRuleRequiredJson,
|
||||||
|
ColumnCustomizationJson = DefaultColumnCustomizationJson,
|
||||||
|
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
|
||||||
|
PivotSettingsJson = DefaultPivotSettingsJson
|
||||||
|
},
|
||||||
|
new() {
|
||||||
|
ListFormCode = listForm.ListFormCode,
|
||||||
|
CultureName = LanguageCodes.En,
|
||||||
|
SourceDbType = DbType.Guid,
|
||||||
|
FieldName = "AnnouncementId",
|
||||||
|
CaptionName = "App.Listform.ListformField.AnnouncementId",
|
||||||
|
Width = 0,
|
||||||
|
ListOrderNo = 4,
|
||||||
|
Visible = false,
|
||||||
|
IsActive = true,
|
||||||
|
ColumnCustomizationJson = DefaultColumnCustomizationJson,
|
||||||
|
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
|
||||||
|
PivotSettingsJson = DefaultPivotSettingsJson
|
||||||
|
},
|
||||||
|
});
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region Survey
|
#region Survey
|
||||||
listFormName = AppCodes.Intranet.Survey;
|
listFormName = AppCodes.Intranet.Survey;
|
||||||
if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName))
|
if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName))
|
||||||
|
|
@ -4237,6 +4493,18 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
||||||
ChildFieldName = "EventId"
|
ChildFieldName = "EventId"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
new {
|
||||||
|
TabType = ListFormTabTypeEnum.List,
|
||||||
|
TabTitle = AppCodes.Intranet.EventComment,
|
||||||
|
Code = AppCodes.Intranet.EventComment,
|
||||||
|
Relation = new List<dynamic>() {
|
||||||
|
new {
|
||||||
|
ParentFieldName = "Id",
|
||||||
|
DbType = DbType.Guid,
|
||||||
|
ChildFieldName = "EventId"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -4579,5 +4847,127 @@ public class ListFormSeeder_Administration : IDataSeedContributor, ITransientDep
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region EventComment
|
||||||
|
listFormName = AppCodes.Intranet.EventComment;
|
||||||
|
if (!await _listFormRepository.AnyAsync(a => a.ListFormCode == listFormName))
|
||||||
|
{
|
||||||
|
var listForm = await _listFormRepository.InsertAsync(
|
||||||
|
new ListForm()
|
||||||
|
{
|
||||||
|
ListFormType = ListFormTypeEnum.List,
|
||||||
|
PageSize = 10,
|
||||||
|
ExportJson = DefaultExportJson,
|
||||||
|
IsSubForm = false,
|
||||||
|
ShowNote = false,
|
||||||
|
LayoutJson = DefaultLayoutJson(),
|
||||||
|
CultureName = LanguageCodes.En,
|
||||||
|
ListFormCode = listFormName,
|
||||||
|
Name = listFormName,
|
||||||
|
Title = listFormName,
|
||||||
|
DataSourceCode = SeedConsts.DataSources.DefaultCode,
|
||||||
|
IsTenant = true,
|
||||||
|
IsBranch = false,
|
||||||
|
IsOrganizationUnit = false,
|
||||||
|
Description = listFormName,
|
||||||
|
SelectCommandType = SelectCommandTypeEnum.Table,
|
||||||
|
SelectCommand = TableNameResolver.GetFullTableName(nameof(TableNameEnum.EventComment)),
|
||||||
|
KeyFieldName = "Id",
|
||||||
|
KeyFieldDbSourceType = DbType.Guid,
|
||||||
|
DefaultFilter = DefaultFilterJson,
|
||||||
|
SortMode = GridOptions.SortModeSingle,
|
||||||
|
FilterRowJson = DefaultFilterRowJson,
|
||||||
|
HeaderFilterJson = DefaultHeaderFilterJson,
|
||||||
|
SearchPanelJson = DefaultSearchPanelJson,
|
||||||
|
GroupPanelJson = DefaultGroupPanelJson,
|
||||||
|
SelectionJson = DefaultSelectionSingleJson,
|
||||||
|
ColumnOptionJson = DefaultColumnOptionJson(),
|
||||||
|
PermissionJson = DefaultPermissionJson(listFormName),
|
||||||
|
DeleteCommand = DefaultDeleteCommand(nameof(TableNameEnum.EventComment)),
|
||||||
|
DeleteFieldsDefaultValueJson = DefaultDeleteFieldsDefaultValueJson(),
|
||||||
|
PagerOptionJson = DefaultPagerOptionJson,
|
||||||
|
EditingOptionJson = DefaultEditingOptionJson(listFormName, 500, 450, true, true, true, true, false),
|
||||||
|
EditingFormJson = JsonSerializer.Serialize(new List<EditingFormDto>() {
|
||||||
|
new() { Order=1, ColCount=1, ColSpan=1, ItemType="group", Items=[
|
||||||
|
new EditingFormItemDto { Order = 1, DataField = "UserId", ColSpan = 1, EditorType2=EditorTypes.dxSelectBox },
|
||||||
|
new EditingFormItemDto { Order = 2, DataField = "Content", ColSpan = 1, EditorType2=EditorTypes.dxTextArea },
|
||||||
|
]}
|
||||||
|
}),
|
||||||
|
InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
#region EventComment Fields
|
||||||
|
await _listFormFieldRepository.InsertManyAsync(new ListFormField[] {
|
||||||
|
new() {
|
||||||
|
ListFormCode = listForm.ListFormCode,
|
||||||
|
CultureName = LanguageCodes.En,
|
||||||
|
SourceDbType = DbType.Guid,
|
||||||
|
FieldName = "Id",
|
||||||
|
CaptionName = "App.Listform.ListformField.Id",
|
||||||
|
Width = 0,
|
||||||
|
ListOrderNo = 1,
|
||||||
|
Visible = false,
|
||||||
|
IsActive = true,
|
||||||
|
ValidationRuleJson = DefaultValidationRuleRequiredJson,
|
||||||
|
ColumnCustomizationJson = DefaultColumnCustomizationJson,
|
||||||
|
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
|
||||||
|
PivotSettingsJson = DefaultPivotSettingsJson
|
||||||
|
},
|
||||||
|
new() {
|
||||||
|
ListFormCode = listForm.ListFormCode,
|
||||||
|
CultureName = LanguageCodes.En,
|
||||||
|
SourceDbType = DbType.Guid,
|
||||||
|
FieldName = "UserId",
|
||||||
|
CaptionName = "App.Listform.ListformField.UserId",
|
||||||
|
Width = 0,
|
||||||
|
ListOrderNo = 2,
|
||||||
|
Visible = true,
|
||||||
|
IsActive = true,
|
||||||
|
AllowSearch = true,
|
||||||
|
LookupJson = JsonSerializer.Serialize(new LookupDto {
|
||||||
|
DataSourceType = UiLookupDataSourceTypeEnum.Query,
|
||||||
|
DisplayExpr = "Name",
|
||||||
|
ValueExpr = "Key",
|
||||||
|
LookupQuery = LookupQueryValues.UserValues
|
||||||
|
}),
|
||||||
|
ValidationRuleJson = DefaultValidationRuleRequiredJson,
|
||||||
|
ColumnCustomizationJson = DefaultColumnCustomizationJson,
|
||||||
|
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
|
||||||
|
PivotSettingsJson = DefaultPivotSettingsJson
|
||||||
|
},
|
||||||
|
new() {
|
||||||
|
ListFormCode = listForm.ListFormCode,
|
||||||
|
CultureName = LanguageCodes.En,
|
||||||
|
SourceDbType = DbType.String,
|
||||||
|
FieldName = "Content",
|
||||||
|
CaptionName = "App.Listform.ListformField.Content",
|
||||||
|
Width = 0,
|
||||||
|
ListOrderNo = 3,
|
||||||
|
Visible = true,
|
||||||
|
IsActive = true,
|
||||||
|
ValidationRuleJson = DefaultValidationRuleRequiredJson,
|
||||||
|
ColumnCustomizationJson = DefaultColumnCustomizationJson,
|
||||||
|
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
|
||||||
|
PivotSettingsJson = DefaultPivotSettingsJson
|
||||||
|
},
|
||||||
|
new() {
|
||||||
|
ListFormCode = listForm.ListFormCode,
|
||||||
|
CultureName = LanguageCodes.En,
|
||||||
|
SourceDbType = DbType.Guid,
|
||||||
|
FieldName = "EventId",
|
||||||
|
CaptionName = "App.Listform.ListformField.EventId",
|
||||||
|
Width = 0,
|
||||||
|
ListOrderNo = 4,
|
||||||
|
Visible = false,
|
||||||
|
IsActive = true,
|
||||||
|
ColumnCustomizationJson = DefaultColumnCustomizationJson,
|
||||||
|
PermissionJson = DefaultFieldPermissionJson(listForm.Name),
|
||||||
|
PivotSettingsJson = DefaultPivotSettingsJson
|
||||||
|
},
|
||||||
|
});
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1064,6 +1064,7 @@ public class ListFormSeeder_Saas : IDataSeedContributor, ITransientDependency
|
||||||
ColumnOptionJson = DefaultColumnOptionJson(),
|
ColumnOptionJson = DefaultColumnOptionJson(),
|
||||||
PermissionJson = DefaultPermissionJson(listFormName),
|
PermissionJson = DefaultPermissionJson(listFormName),
|
||||||
PagerOptionJson = DefaultPagerOptionJson,
|
PagerOptionJson = DefaultPagerOptionJson,
|
||||||
|
InsertFieldsDefaultValueJson = DefaultInsertFieldsDefaultValueJson(),
|
||||||
DeleteCommand = $"DELETE FROM \"{TableNameResolver.GetFullTableName(nameof(TableNameEnum.GlobalSearch))}\" WHERE \"Id\"=@Id",
|
DeleteCommand = $"DELETE FROM \"{TableNameResolver.GetFullTableName(nameof(TableNameEnum.GlobalSearch))}\" WHERE \"Id\"=@Id",
|
||||||
DeleteFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] {
|
DeleteFieldsDefaultValueJson = JsonSerializer.Serialize(new FieldsDefaultValue[] {
|
||||||
new() { FieldName = "Id", FieldDbType = DbType.Int32, Value = "@ID", CustomValueType = FieldCustomValueTypeEnum.CustomKey }
|
new() { FieldName = "Id", FieldDbType = DbType.Int32, Value = "@ID", CustomValueType = FieldCustomValueTypeEnum.CustomKey }
|
||||||
|
|
|
||||||
|
|
@ -3754,6 +3754,60 @@
|
||||||
"MultiTenancySide": 3,
|
"MultiTenancySide": 3,
|
||||||
"MenuGroup": "Erp|Kurs"
|
"MenuGroup": "Erp|Kurs"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"GroupName": "App.Administration",
|
||||||
|
"Name": "App.Intranet.Events.EventComment",
|
||||||
|
"ParentName": "App.Intranet",
|
||||||
|
"DisplayName": "App.Intranet.Events.EventComment",
|
||||||
|
"IsEnabled": true,
|
||||||
|
"MultiTenancySide": 3,
|
||||||
|
"MenuGroup": "Erp|Kurs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GroupName": "App.Administration",
|
||||||
|
"Name": "App.Intranet.Events.EventComment.Create",
|
||||||
|
"ParentName": "App.Intranet.Events.EventComment",
|
||||||
|
"DisplayName": "Create",
|
||||||
|
"IsEnabled": true,
|
||||||
|
"MultiTenancySide": 3,
|
||||||
|
"MenuGroup": "Erp|Kurs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GroupName": "App.Administration",
|
||||||
|
"Name": "App.Intranet.Events.EventComment.Update",
|
||||||
|
"ParentName": "App.Intranet.Events.EventComment",
|
||||||
|
"DisplayName": "Update",
|
||||||
|
"IsEnabled": true,
|
||||||
|
"MultiTenancySide": 3,
|
||||||
|
"MenuGroup": "Erp|Kurs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GroupName": "App.Administration",
|
||||||
|
"Name": "App.Intranet.Events.EventComment.Delete",
|
||||||
|
"ParentName": "App.Intranet.Events.EventComment",
|
||||||
|
"DisplayName": "Delete",
|
||||||
|
"IsEnabled": true,
|
||||||
|
"MultiTenancySide": 3,
|
||||||
|
"MenuGroup": "Erp|Kurs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GroupName": "App.Administration",
|
||||||
|
"Name": "App.Intranet.Events.EventComment.Export",
|
||||||
|
"ParentName": "App.Intranet.Events.EventComment",
|
||||||
|
"DisplayName": "Export",
|
||||||
|
"IsEnabled": true,
|
||||||
|
"MultiTenancySide": 3,
|
||||||
|
"MenuGroup": "Erp|Kurs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GroupName": "App.Administration",
|
||||||
|
"Name": "App.Intranet.Events.EventComment.Import",
|
||||||
|
"ParentName": "App.Intranet.Events.EventComment",
|
||||||
|
"DisplayName": "Import",
|
||||||
|
"IsEnabled": true,
|
||||||
|
"MultiTenancySide": 3,
|
||||||
|
"MenuGroup": "Erp|Kurs"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"GroupName": "App.Administration",
|
"GroupName": "App.Administration",
|
||||||
"Name": "App.Intranet.Announcement",
|
"Name": "App.Intranet.Announcement",
|
||||||
|
|
@ -3817,6 +3871,125 @@
|
||||||
"MultiTenancySide": 3,
|
"MultiTenancySide": 3,
|
||||||
"MenuGroup": "Erp|Kurs"
|
"MenuGroup": "Erp|Kurs"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"GroupName": "App.Administration",
|
||||||
|
"Name": "App.Intranet.Announcement.Note",
|
||||||
|
"ParentName": "App.Intranet.Announcement",
|
||||||
|
"DisplayName": "Note",
|
||||||
|
"IsEnabled": true,
|
||||||
|
"MultiTenancySide": 3,
|
||||||
|
"MenuGroup": "Erp|Kurs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GroupName": "App.Administration",
|
||||||
|
"Name": "App.Intranet.Announcement.AnnouncementLike",
|
||||||
|
"ParentName": "App.Intranet",
|
||||||
|
"DisplayName": "App.Intranet.Announcement.AnnouncementLike",
|
||||||
|
"IsEnabled": true,
|
||||||
|
"MultiTenancySide": 3,
|
||||||
|
"MenuGroup": "Erp|Kurs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GroupName": "App.Administration",
|
||||||
|
"Name": "App.Intranet.Announcement.AnnouncementLike.Create",
|
||||||
|
"ParentName": "App.Intranet.Announcement.AnnouncementLike",
|
||||||
|
"DisplayName": "Create",
|
||||||
|
"IsEnabled": true,
|
||||||
|
"MultiTenancySide": 3,
|
||||||
|
"MenuGroup": "Erp|Kurs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GroupName": "App.Administration",
|
||||||
|
"Name": "App.Intranet.Announcement.AnnouncementLike.Update",
|
||||||
|
"ParentName": "App.Intranet.Announcement.AnnouncementLike",
|
||||||
|
"DisplayName": "Update",
|
||||||
|
"IsEnabled": true,
|
||||||
|
"MultiTenancySide": 3,
|
||||||
|
"MenuGroup": "Erp|Kurs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GroupName": "App.Administration",
|
||||||
|
"Name": "App.Intranet.Announcement.AnnouncementLike.Delete",
|
||||||
|
"ParentName": "App.Intranet.Announcement.AnnouncementLike",
|
||||||
|
"DisplayName": "Delete",
|
||||||
|
"IsEnabled": true,
|
||||||
|
"MultiTenancySide": 3,
|
||||||
|
"MenuGroup": "Erp|Kurs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GroupName": "App.Administration",
|
||||||
|
"Name": "App.Intranet.Announcement.AnnouncementLike.Export",
|
||||||
|
"ParentName": "App.Intranet.Announcement.AnnouncementLike",
|
||||||
|
"DisplayName": "Export",
|
||||||
|
"IsEnabled": true,
|
||||||
|
"MultiTenancySide": 3,
|
||||||
|
"MenuGroup": "Erp|Kurs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GroupName": "App.Administration",
|
||||||
|
"Name": "App.Intranet.Announcement.AnnouncementLike.Import",
|
||||||
|
"ParentName": "App.Intranet.Announcement.AnnouncementLike",
|
||||||
|
"DisplayName": "Import",
|
||||||
|
"IsEnabled": true,
|
||||||
|
"MultiTenancySide": 3,
|
||||||
|
"MenuGroup": "Erp|Kurs"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"GroupName": "App.Administration",
|
||||||
|
"Name": "App.Intranet.Announcement.AnnouncementComment",
|
||||||
|
"ParentName": "App.Intranet",
|
||||||
|
"DisplayName": "App.Intranet.Announcement.AnnouncementComment",
|
||||||
|
"IsEnabled": true,
|
||||||
|
"MultiTenancySide": 3,
|
||||||
|
"MenuGroup": "Erp|Kurs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GroupName": "App.Administration",
|
||||||
|
"Name": "App.Intranet.Announcement.AnnouncementComment.Create",
|
||||||
|
"ParentName": "App.Intranet.Announcement.AnnouncementComment",
|
||||||
|
"DisplayName": "Create",
|
||||||
|
"IsEnabled": true,
|
||||||
|
"MultiTenancySide": 3,
|
||||||
|
"MenuGroup": "Erp|Kurs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GroupName": "App.Administration",
|
||||||
|
"Name": "App.Intranet.Announcement.AnnouncementComment.Update",
|
||||||
|
"ParentName": "App.Intranet.Announcement.AnnouncementComment",
|
||||||
|
"DisplayName": "Update",
|
||||||
|
"IsEnabled": true,
|
||||||
|
"MultiTenancySide": 3,
|
||||||
|
"MenuGroup": "Erp|Kurs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GroupName": "App.Administration",
|
||||||
|
"Name": "App.Intranet.Announcement.AnnouncementComment.Delete",
|
||||||
|
"ParentName": "App.Intranet.Announcement.AnnouncementComment",
|
||||||
|
"DisplayName": "Delete",
|
||||||
|
"IsEnabled": true,
|
||||||
|
"MultiTenancySide": 3,
|
||||||
|
"MenuGroup": "Erp|Kurs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GroupName": "App.Administration",
|
||||||
|
"Name": "App.Intranet.Announcement.AnnouncementComment.Export",
|
||||||
|
"ParentName": "App.Intranet.Announcement.AnnouncementComment",
|
||||||
|
"DisplayName": "Export",
|
||||||
|
"IsEnabled": true,
|
||||||
|
"MultiTenancySide": 3,
|
||||||
|
"MenuGroup": "Erp|Kurs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"GroupName": "App.Administration",
|
||||||
|
"Name": "App.Intranet.Announcement.AnnouncementComment.Import",
|
||||||
|
"ParentName": "App.Intranet.Announcement.AnnouncementComment",
|
||||||
|
"DisplayName": "Import",
|
||||||
|
"IsEnabled": true,
|
||||||
|
"MultiTenancySide": 3,
|
||||||
|
"MenuGroup": "Erp|Kurs"
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"GroupName": "App.Administration",
|
"GroupName": "App.Administration",
|
||||||
"Name": "App.Intranet.SocialPost",
|
"Name": "App.Intranet.SocialPost",
|
||||||
|
|
|
||||||
|
|
@ -68,6 +68,8 @@ public enum TableNameEnum
|
||||||
Demo,
|
Demo,
|
||||||
Contact,
|
Contact,
|
||||||
Announcement,
|
Announcement,
|
||||||
|
AnnouncementComment,
|
||||||
|
AnnouncementLike,
|
||||||
Survey,
|
Survey,
|
||||||
SurveyQuestion,
|
SurveyQuestion,
|
||||||
SurveyQuestionOption,
|
SurveyQuestionOption,
|
||||||
|
|
|
||||||
|
|
@ -87,6 +87,8 @@ public static class TableNameResolver
|
||||||
|
|
||||||
// 🔹 INTRANET TABLOLARI
|
// 🔹 INTRANET TABLOLARI
|
||||||
{ nameof(TableNameEnum.Announcement), (TablePrefix.TenantByName, MenuPrefix.Administration) },
|
{ nameof(TableNameEnum.Announcement), (TablePrefix.TenantByName, MenuPrefix.Administration) },
|
||||||
|
{ nameof(TableNameEnum.AnnouncementComment), (TablePrefix.TenantByName, MenuPrefix.Administration) },
|
||||||
|
{ nameof(TableNameEnum.AnnouncementLike), (TablePrefix.TenantByName, MenuPrefix.Administration) },
|
||||||
{ nameof(TableNameEnum.Survey), (TablePrefix.TenantByName, MenuPrefix.Administration) },
|
{ nameof(TableNameEnum.Survey), (TablePrefix.TenantByName, MenuPrefix.Administration) },
|
||||||
{ nameof(TableNameEnum.SurveyQuestion), (TablePrefix.TenantByName, MenuPrefix.Administration) },
|
{ nameof(TableNameEnum.SurveyQuestion), (TablePrefix.TenantByName, MenuPrefix.Administration) },
|
||||||
{ nameof(TableNameEnum.SurveyQuestionOption), (TablePrefix.TenantByName, MenuPrefix.Administration) },
|
{ nameof(TableNameEnum.SurveyQuestionOption), (TablePrefix.TenantByName, MenuPrefix.Administration) },
|
||||||
|
|
|
||||||
|
|
@ -327,6 +327,8 @@ public static class SeedConsts
|
||||||
public const string Default = Prefix.App + ".Intranet";
|
public const string Default = Prefix.App + ".Intranet";
|
||||||
|
|
||||||
public const string Announcement = Default + ".Announcement";
|
public const string Announcement = Default + ".Announcement";
|
||||||
|
public const string AnnouncementLike = Announcement + ".AnnouncementLike";
|
||||||
|
public const string AnnouncementComment = Announcement + ".AnnouncementComment";
|
||||||
|
|
||||||
public const string Survey = Default + ".Survey";
|
public const string Survey = Default + ".Survey";
|
||||||
public const string SurveyQuestion = Default + ".SurveyQuestion";
|
public const string SurveyQuestion = Default + ".SurveyQuestion";
|
||||||
|
|
@ -342,6 +344,7 @@ public static class SeedConsts
|
||||||
public const string EventCategory = Events + ".EventCategory";
|
public const string EventCategory = Events + ".EventCategory";
|
||||||
public const string Event = Events + ".Event";
|
public const string Event = Events + ".Event";
|
||||||
public const string EventLike = Events + ".EventLike";
|
public const string EventLike = Events + ".EventLike";
|
||||||
|
public const string EventComment = Events + ".EventComment";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Definitions
|
public static class Definitions
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,10 @@ public class Announcement : FullAuditedEntity<Guid>, IMultiTenant
|
||||||
public DateTime? ExpiryDate { get; set; }
|
public DateTime? ExpiryDate { get; set; }
|
||||||
public bool IsPinned { get; set; }
|
public bool IsPinned { get; set; }
|
||||||
public int ViewCount { get; set; }
|
public int ViewCount { get; set; }
|
||||||
|
public int Likes { get; set; }
|
||||||
public string Attachments { get; set; }
|
public string Attachments { get; set; }
|
||||||
|
|
||||||
|
public System.Collections.Generic.ICollection<AnnouncementComment> Comments { get; set; } = [];
|
||||||
|
public System.Collections.Generic.ICollection<AnnouncementLike> AnnouncementLikes { get; set; } = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
using System;
|
||||||
|
using Volo.Abp.Domain.Entities.Auditing;
|
||||||
|
using Volo.Abp.MultiTenancy;
|
||||||
|
|
||||||
|
namespace Sozsoft.Platform.Entities;
|
||||||
|
|
||||||
|
public class AnnouncementComment : FullAuditedEntity<Guid>, IMultiTenant
|
||||||
|
{
|
||||||
|
public Guid? TenantId { get; set; }
|
||||||
|
|
||||||
|
public Guid AnnouncementId { get; set; }
|
||||||
|
public Announcement Announcement { get; set; }
|
||||||
|
|
||||||
|
public Guid UserId { get; set; }
|
||||||
|
public string Content { get; set; }
|
||||||
|
public int Likes { get; set; }
|
||||||
|
|
||||||
|
Guid? IMultiTenant.TenantId => TenantId;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
using System;
|
||||||
|
using Volo.Abp.Domain.Entities.Auditing;
|
||||||
|
using Volo.Abp.MultiTenancy;
|
||||||
|
|
||||||
|
namespace Sozsoft.Platform.Entities;
|
||||||
|
|
||||||
|
public class AnnouncementLike : FullAuditedEntity<Guid>, IMultiTenant
|
||||||
|
{
|
||||||
|
public Guid? TenantId { get; set; }
|
||||||
|
|
||||||
|
public Guid AnnouncementId { get; set; }
|
||||||
|
public Announcement Announcement { get; set; }
|
||||||
|
|
||||||
|
public Guid? UserId { get; set; }
|
||||||
|
|
||||||
|
public AnnouncementLike(Guid id)
|
||||||
|
{
|
||||||
|
Id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected AnnouncementLike() { }
|
||||||
|
|
||||||
|
Guid? IMultiTenant.TenantId => TenantId;
|
||||||
|
}
|
||||||
|
|
@ -124,6 +124,8 @@ public class PlatformDbContext :
|
||||||
public DbSet<MessengerConversationMessage> MessengerConversationMessages { get; set; }
|
public DbSet<MessengerConversationMessage> MessengerConversationMessages { get; set; }
|
||||||
|
|
||||||
public DbSet<Announcement> Announcements { get; set; }
|
public DbSet<Announcement> Announcements { get; set; }
|
||||||
|
public DbSet<AnnouncementComment> AnnouncementComments { get; set; }
|
||||||
|
public DbSet<AnnouncementLike> AnnouncementLikes { get; set; }
|
||||||
|
|
||||||
public DbSet<Survey> Surveys { get; set; }
|
public DbSet<Survey> Surveys { get; set; }
|
||||||
public DbSet<SurveyQuestion> SurveyQuestions { get; set; }
|
public DbSet<SurveyQuestion> SurveyQuestions { get; set; }
|
||||||
|
|
@ -1151,6 +1153,31 @@ public class PlatformDbContext :
|
||||||
b.HasIndex(x => new { x.TenantId, x.Title }).IsUnique().HasFilter("[IsDeleted] = 0");
|
b.HasIndex(x => new { x.TenantId, x.Title }).IsUnique().HasFilter("[IsDeleted] = 0");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
builder.Entity<AnnouncementComment>(b =>
|
||||||
|
{
|
||||||
|
b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.AnnouncementComment)), Prefix.DbSchema);
|
||||||
|
b.ConfigureByConvention();
|
||||||
|
|
||||||
|
b.Property(x => x.Content).IsRequired().HasMaxLength(8192);
|
||||||
|
b.Property(x => x.Likes).HasDefaultValue(0);
|
||||||
|
|
||||||
|
b.HasOne(x => x.Announcement)
|
||||||
|
.WithMany(x => x.Comments)
|
||||||
|
.HasForeignKey(x => x.AnnouncementId)
|
||||||
|
.OnDelete(DeleteBehavior.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
builder.Entity<AnnouncementLike>(b =>
|
||||||
|
{
|
||||||
|
b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.AnnouncementLike)), Prefix.DbSchema);
|
||||||
|
b.ConfigureByConvention();
|
||||||
|
|
||||||
|
b.HasOne(x => x.Announcement)
|
||||||
|
.WithMany(x => x.AnnouncementLikes)
|
||||||
|
.HasForeignKey(x => x.AnnouncementId)
|
||||||
|
.OnDelete(DeleteBehavior.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
builder.Entity<Survey>(b =>
|
builder.Entity<Survey>(b =>
|
||||||
{
|
{
|
||||||
b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.Survey)), Prefix.DbSchema);
|
b.ToTable(TableNameResolver.GetFullTableName(nameof(TableNameEnum.Survey)), Prefix.DbSchema);
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore;
|
||||||
namespace Sozsoft.Platform.Migrations
|
namespace Sozsoft.Platform.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(PlatformDbContext))]
|
[DbContext(typeof(PlatformDbContext))]
|
||||||
[Migration("20260612183658_Initial")]
|
[Migration("20260615110840_Initial")]
|
||||||
partial class Initial
|
partial class Initial
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
|
@ -771,6 +771,9 @@ namespace Sozsoft.Platform.Migrations
|
||||||
.HasColumnType("uniqueidentifier")
|
.HasColumnType("uniqueidentifier")
|
||||||
.HasColumnName("LastModifierId");
|
.HasColumnName("LastModifierId");
|
||||||
|
|
||||||
|
b.Property<int>("Likes")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
b.Property<DateTime>("PublishDate")
|
b.Property<DateTime>("PublishDate")
|
||||||
.HasColumnType("datetime2");
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
|
|
@ -800,6 +803,120 @@ namespace Sozsoft.Platform.Migrations
|
||||||
b.ToTable("Adm_T_Announcement", (string)null);
|
b.ToTable("Adm_T_Announcement", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Sozsoft.Platform.Entities.AnnouncementComment", b =>
|
||||||
|
{
|
||||||
|
b.Property<Guid>("Id")
|
||||||
|
.HasColumnType("uniqueidentifier");
|
||||||
|
|
||||||
|
b.Property<Guid>("AnnouncementId")
|
||||||
|
.HasColumnType("uniqueidentifier");
|
||||||
|
|
||||||
|
b.Property<string>("Content")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(8192)
|
||||||
|
.HasColumnType("nvarchar(max)");
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreationTime")
|
||||||
|
.HasColumnType("datetime2")
|
||||||
|
.HasColumnName("CreationTime");
|
||||||
|
|
||||||
|
b.Property<Guid?>("CreatorId")
|
||||||
|
.HasColumnType("uniqueidentifier")
|
||||||
|
.HasColumnName("CreatorId");
|
||||||
|
|
||||||
|
b.Property<Guid?>("DeleterId")
|
||||||
|
.HasColumnType("uniqueidentifier")
|
||||||
|
.HasColumnName("DeleterId");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("DeletionTime")
|
||||||
|
.HasColumnType("datetime2")
|
||||||
|
.HasColumnName("DeletionTime");
|
||||||
|
|
||||||
|
b.Property<bool>("IsDeleted")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("bit")
|
||||||
|
.HasDefaultValue(false)
|
||||||
|
.HasColumnName("IsDeleted");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("LastModificationTime")
|
||||||
|
.HasColumnType("datetime2")
|
||||||
|
.HasColumnName("LastModificationTime");
|
||||||
|
|
||||||
|
b.Property<Guid?>("LastModifierId")
|
||||||
|
.HasColumnType("uniqueidentifier")
|
||||||
|
.HasColumnName("LastModifierId");
|
||||||
|
|
||||||
|
b.Property<int>("Likes")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int")
|
||||||
|
.HasDefaultValue(0);
|
||||||
|
|
||||||
|
b.Property<Guid?>("TenantId")
|
||||||
|
.HasColumnType("uniqueidentifier")
|
||||||
|
.HasColumnName("TenantId");
|
||||||
|
|
||||||
|
b.Property<Guid>("UserId")
|
||||||
|
.HasColumnType("uniqueidentifier");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("AnnouncementId");
|
||||||
|
|
||||||
|
b.ToTable("Adm_T_AnnouncementComment", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Sozsoft.Platform.Entities.AnnouncementLike", b =>
|
||||||
|
{
|
||||||
|
b.Property<Guid>("Id")
|
||||||
|
.HasColumnType("uniqueidentifier");
|
||||||
|
|
||||||
|
b.Property<Guid>("AnnouncementId")
|
||||||
|
.HasColumnType("uniqueidentifier");
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreationTime")
|
||||||
|
.HasColumnType("datetime2")
|
||||||
|
.HasColumnName("CreationTime");
|
||||||
|
|
||||||
|
b.Property<Guid?>("CreatorId")
|
||||||
|
.HasColumnType("uniqueidentifier")
|
||||||
|
.HasColumnName("CreatorId");
|
||||||
|
|
||||||
|
b.Property<Guid?>("DeleterId")
|
||||||
|
.HasColumnType("uniqueidentifier")
|
||||||
|
.HasColumnName("DeleterId");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("DeletionTime")
|
||||||
|
.HasColumnType("datetime2")
|
||||||
|
.HasColumnName("DeletionTime");
|
||||||
|
|
||||||
|
b.Property<bool>("IsDeleted")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("bit")
|
||||||
|
.HasDefaultValue(false)
|
||||||
|
.HasColumnName("IsDeleted");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("LastModificationTime")
|
||||||
|
.HasColumnType("datetime2")
|
||||||
|
.HasColumnName("LastModificationTime");
|
||||||
|
|
||||||
|
b.Property<Guid?>("LastModifierId")
|
||||||
|
.HasColumnType("uniqueidentifier")
|
||||||
|
.HasColumnName("LastModifierId");
|
||||||
|
|
||||||
|
b.Property<Guid?>("TenantId")
|
||||||
|
.HasColumnType("uniqueidentifier")
|
||||||
|
.HasColumnName("TenantId");
|
||||||
|
|
||||||
|
b.Property<Guid?>("UserId")
|
||||||
|
.HasColumnType("uniqueidentifier");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("AnnouncementId");
|
||||||
|
|
||||||
|
b.ToTable("Adm_T_AnnouncementLike", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Sozsoft.Platform.Entities.BackgroundWorker", b =>
|
modelBuilder.Entity("Sozsoft.Platform.Entities.BackgroundWorker", b =>
|
||||||
{
|
{
|
||||||
b.Property<Guid>("Id")
|
b.Property<Guid>("Id")
|
||||||
|
|
@ -8295,6 +8412,28 @@ namespace Sozsoft.Platform.Migrations
|
||||||
b.Navigation("NotificationType");
|
b.Navigation("NotificationType");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Sozsoft.Platform.Entities.AnnouncementComment", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Sozsoft.Platform.Entities.Announcement", "Announcement")
|
||||||
|
.WithMany("Comments")
|
||||||
|
.HasForeignKey("AnnouncementId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Announcement");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Sozsoft.Platform.Entities.AnnouncementLike", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Sozsoft.Platform.Entities.Announcement", "Announcement")
|
||||||
|
.WithMany("AnnouncementLikes")
|
||||||
|
.HasForeignKey("AnnouncementId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Announcement");
|
||||||
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Sozsoft.Platform.Entities.BlogPost", b =>
|
modelBuilder.Entity("Sozsoft.Platform.Entities.BlogPost", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("Sozsoft.Platform.Entities.BlogCategory", "Category")
|
b.HasOne("Sozsoft.Platform.Entities.BlogCategory", "Category")
|
||||||
|
|
@ -8824,6 +8963,13 @@ namespace Sozsoft.Platform.Migrations
|
||||||
b.Navigation("Notifications");
|
b.Navigation("Notifications");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Sozsoft.Platform.Entities.Announcement", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("AnnouncementLikes");
|
||||||
|
|
||||||
|
b.Navigation("Comments");
|
||||||
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Sozsoft.Platform.Entities.BlogCategory", b =>
|
modelBuilder.Entity("Sozsoft.Platform.Entities.BlogCategory", b =>
|
||||||
{
|
{
|
||||||
b.Navigation("Posts");
|
b.Navigation("Posts");
|
||||||
|
|
@ -497,6 +497,7 @@ namespace Sozsoft.Platform.Migrations
|
||||||
ExpiryDate = table.Column<DateTime>(type: "datetime2", nullable: true),
|
ExpiryDate = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||||
IsPinned = table.Column<bool>(type: "bit", nullable: false),
|
IsPinned = table.Column<bool>(type: "bit", nullable: false),
|
||||||
ViewCount = table.Column<int>(type: "int", nullable: false, defaultValue: 0),
|
ViewCount = table.Column<int>(type: "int", nullable: false, defaultValue: 0),
|
||||||
|
Likes = table.Column<int>(type: "int", nullable: false),
|
||||||
Attachments = table.Column<string>(type: "nvarchar(2048)", maxLength: 2048, nullable: true),
|
Attachments = table.Column<string>(type: "nvarchar(2048)", maxLength: 2048, nullable: true),
|
||||||
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
|
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||||
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
||||||
|
|
@ -2074,6 +2075,62 @@ namespace Sozsoft.Platform.Migrations
|
||||||
onDelete: ReferentialAction.Cascade);
|
onDelete: ReferentialAction.Cascade);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "Adm_T_AnnouncementComment",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||||
|
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
||||||
|
AnnouncementId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||||
|
UserId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||||
|
Content = table.Column<string>(type: "nvarchar(max)", maxLength: 8192, nullable: false),
|
||||||
|
Likes = table.Column<int>(type: "int", nullable: false, defaultValue: 0),
|
||||||
|
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||||
|
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
||||||
|
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||||
|
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
||||||
|
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
|
||||||
|
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
||||||
|
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_Adm_T_AnnouncementComment", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_Adm_T_AnnouncementComment_Adm_T_Announcement_AnnouncementId",
|
||||||
|
column: x => x.AnnouncementId,
|
||||||
|
principalTable: "Adm_T_Announcement",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "Adm_T_AnnouncementLike",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||||
|
TenantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
||||||
|
AnnouncementId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||||
|
UserId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
||||||
|
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||||
|
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
||||||
|
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||||
|
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
||||||
|
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
|
||||||
|
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
||||||
|
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_Adm_T_AnnouncementLike", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_Adm_T_AnnouncementLike_Adm_T_Announcement_AnnouncementId",
|
||||||
|
column: x => x.AnnouncementId,
|
||||||
|
principalTable: "Adm_T_Announcement",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
migrationBuilder.CreateTable(
|
||||||
name: "Adm_T_JobPosition",
|
name: "Adm_T_JobPosition",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
|
|
@ -3563,6 +3620,16 @@ namespace Sozsoft.Platform.Migrations
|
||||||
unique: true,
|
unique: true,
|
||||||
filter: "[IsDeleted] = 0");
|
filter: "[IsDeleted] = 0");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_Adm_T_AnnouncementComment_AnnouncementId",
|
||||||
|
table: "Adm_T_AnnouncementComment",
|
||||||
|
column: "AnnouncementId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_Adm_T_AnnouncementLike_AnnouncementId",
|
||||||
|
table: "Adm_T_AnnouncementLike",
|
||||||
|
column: "AnnouncementId");
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
migrationBuilder.CreateIndex(
|
||||||
name: "IX_Adm_T_Department_TenantId_Name",
|
name: "IX_Adm_T_Department_TenantId_Name",
|
||||||
table: "Adm_T_Department",
|
table: "Adm_T_Department",
|
||||||
|
|
@ -4211,7 +4278,10 @@ namespace Sozsoft.Platform.Migrations
|
||||||
name: "AbpUserTokens");
|
name: "AbpUserTokens");
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
migrationBuilder.DropTable(
|
||||||
name: "Adm_T_Announcement");
|
name: "Adm_T_AnnouncementComment");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "Adm_T_AnnouncementLike");
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
migrationBuilder.DropTable(
|
||||||
name: "Adm_T_EventComment");
|
name: "Adm_T_EventComment");
|
||||||
|
|
@ -4408,6 +4478,9 @@ namespace Sozsoft.Platform.Migrations
|
||||||
migrationBuilder.DropTable(
|
migrationBuilder.DropTable(
|
||||||
name: "AbpUsers");
|
name: "AbpUsers");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "Adm_T_Announcement");
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
migrationBuilder.DropTable(
|
||||||
name: "Adm_T_Event");
|
name: "Adm_T_Event");
|
||||||
|
|
||||||
|
|
@ -768,6 +768,9 @@ namespace Sozsoft.Platform.Migrations
|
||||||
.HasColumnType("uniqueidentifier")
|
.HasColumnType("uniqueidentifier")
|
||||||
.HasColumnName("LastModifierId");
|
.HasColumnName("LastModifierId");
|
||||||
|
|
||||||
|
b.Property<int>("Likes")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
b.Property<DateTime>("PublishDate")
|
b.Property<DateTime>("PublishDate")
|
||||||
.HasColumnType("datetime2");
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
|
|
@ -797,6 +800,120 @@ namespace Sozsoft.Platform.Migrations
|
||||||
b.ToTable("Adm_T_Announcement", (string)null);
|
b.ToTable("Adm_T_Announcement", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Sozsoft.Platform.Entities.AnnouncementComment", b =>
|
||||||
|
{
|
||||||
|
b.Property<Guid>("Id")
|
||||||
|
.HasColumnType("uniqueidentifier");
|
||||||
|
|
||||||
|
b.Property<Guid>("AnnouncementId")
|
||||||
|
.HasColumnType("uniqueidentifier");
|
||||||
|
|
||||||
|
b.Property<string>("Content")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(8192)
|
||||||
|
.HasColumnType("nvarchar(max)");
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreationTime")
|
||||||
|
.HasColumnType("datetime2")
|
||||||
|
.HasColumnName("CreationTime");
|
||||||
|
|
||||||
|
b.Property<Guid?>("CreatorId")
|
||||||
|
.HasColumnType("uniqueidentifier")
|
||||||
|
.HasColumnName("CreatorId");
|
||||||
|
|
||||||
|
b.Property<Guid?>("DeleterId")
|
||||||
|
.HasColumnType("uniqueidentifier")
|
||||||
|
.HasColumnName("DeleterId");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("DeletionTime")
|
||||||
|
.HasColumnType("datetime2")
|
||||||
|
.HasColumnName("DeletionTime");
|
||||||
|
|
||||||
|
b.Property<bool>("IsDeleted")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("bit")
|
||||||
|
.HasDefaultValue(false)
|
||||||
|
.HasColumnName("IsDeleted");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("LastModificationTime")
|
||||||
|
.HasColumnType("datetime2")
|
||||||
|
.HasColumnName("LastModificationTime");
|
||||||
|
|
||||||
|
b.Property<Guid?>("LastModifierId")
|
||||||
|
.HasColumnType("uniqueidentifier")
|
||||||
|
.HasColumnName("LastModifierId");
|
||||||
|
|
||||||
|
b.Property<int>("Likes")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int")
|
||||||
|
.HasDefaultValue(0);
|
||||||
|
|
||||||
|
b.Property<Guid?>("TenantId")
|
||||||
|
.HasColumnType("uniqueidentifier")
|
||||||
|
.HasColumnName("TenantId");
|
||||||
|
|
||||||
|
b.Property<Guid>("UserId")
|
||||||
|
.HasColumnType("uniqueidentifier");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("AnnouncementId");
|
||||||
|
|
||||||
|
b.ToTable("Adm_T_AnnouncementComment", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Sozsoft.Platform.Entities.AnnouncementLike", b =>
|
||||||
|
{
|
||||||
|
b.Property<Guid>("Id")
|
||||||
|
.HasColumnType("uniqueidentifier");
|
||||||
|
|
||||||
|
b.Property<Guid>("AnnouncementId")
|
||||||
|
.HasColumnType("uniqueidentifier");
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreationTime")
|
||||||
|
.HasColumnType("datetime2")
|
||||||
|
.HasColumnName("CreationTime");
|
||||||
|
|
||||||
|
b.Property<Guid?>("CreatorId")
|
||||||
|
.HasColumnType("uniqueidentifier")
|
||||||
|
.HasColumnName("CreatorId");
|
||||||
|
|
||||||
|
b.Property<Guid?>("DeleterId")
|
||||||
|
.HasColumnType("uniqueidentifier")
|
||||||
|
.HasColumnName("DeleterId");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("DeletionTime")
|
||||||
|
.HasColumnType("datetime2")
|
||||||
|
.HasColumnName("DeletionTime");
|
||||||
|
|
||||||
|
b.Property<bool>("IsDeleted")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("bit")
|
||||||
|
.HasDefaultValue(false)
|
||||||
|
.HasColumnName("IsDeleted");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("LastModificationTime")
|
||||||
|
.HasColumnType("datetime2")
|
||||||
|
.HasColumnName("LastModificationTime");
|
||||||
|
|
||||||
|
b.Property<Guid?>("LastModifierId")
|
||||||
|
.HasColumnType("uniqueidentifier")
|
||||||
|
.HasColumnName("LastModifierId");
|
||||||
|
|
||||||
|
b.Property<Guid?>("TenantId")
|
||||||
|
.HasColumnType("uniqueidentifier")
|
||||||
|
.HasColumnName("TenantId");
|
||||||
|
|
||||||
|
b.Property<Guid?>("UserId")
|
||||||
|
.HasColumnType("uniqueidentifier");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("AnnouncementId");
|
||||||
|
|
||||||
|
b.ToTable("Adm_T_AnnouncementLike", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Sozsoft.Platform.Entities.BackgroundWorker", b =>
|
modelBuilder.Entity("Sozsoft.Platform.Entities.BackgroundWorker", b =>
|
||||||
{
|
{
|
||||||
b.Property<Guid>("Id")
|
b.Property<Guid>("Id")
|
||||||
|
|
@ -8292,6 +8409,28 @@ namespace Sozsoft.Platform.Migrations
|
||||||
b.Navigation("NotificationType");
|
b.Navigation("NotificationType");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Sozsoft.Platform.Entities.AnnouncementComment", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Sozsoft.Platform.Entities.Announcement", "Announcement")
|
||||||
|
.WithMany("Comments")
|
||||||
|
.HasForeignKey("AnnouncementId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Announcement");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Sozsoft.Platform.Entities.AnnouncementLike", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Sozsoft.Platform.Entities.Announcement", "Announcement")
|
||||||
|
.WithMany("AnnouncementLikes")
|
||||||
|
.HasForeignKey("AnnouncementId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Announcement");
|
||||||
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Sozsoft.Platform.Entities.BlogPost", b =>
|
modelBuilder.Entity("Sozsoft.Platform.Entities.BlogPost", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("Sozsoft.Platform.Entities.BlogCategory", "Category")
|
b.HasOne("Sozsoft.Platform.Entities.BlogCategory", "Category")
|
||||||
|
|
@ -8821,6 +8960,13 @@ namespace Sozsoft.Platform.Migrations
|
||||||
b.Navigation("Notifications");
|
b.Navigation("Notifications");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Sozsoft.Platform.Entities.Announcement", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("AnnouncementLikes");
|
||||||
|
|
||||||
|
b.Navigation("Comments");
|
||||||
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Sozsoft.Platform.Entities.BlogCategory", b =>
|
modelBuilder.Entity("Sozsoft.Platform.Entities.BlogCategory", b =>
|
||||||
{
|
{
|
||||||
b.Navigation("Posts");
|
b.Navigation("Posts");
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,16 @@ export interface EventCommentDto {
|
||||||
likes: number
|
likes: number
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface AnnouncementCommentDto {
|
||||||
|
id: string
|
||||||
|
announcementId: string
|
||||||
|
userId: string
|
||||||
|
user: UserInfoViewModel
|
||||||
|
content: string
|
||||||
|
creationTime: Date
|
||||||
|
likes: number
|
||||||
|
}
|
||||||
|
|
||||||
// Doküman (FileItemDto ile uyumlu)
|
// Doküman (FileItemDto ile uyumlu)
|
||||||
export interface DocumentDto {
|
export interface DocumentDto {
|
||||||
id: string
|
id: string
|
||||||
|
|
@ -68,6 +78,9 @@ export interface AnnouncementDto {
|
||||||
expiryDate?: Date
|
expiryDate?: Date
|
||||||
isPinned: boolean
|
isPinned: boolean
|
||||||
viewCount: number
|
viewCount: number
|
||||||
|
likes: number
|
||||||
|
isLiked: boolean
|
||||||
|
comments: AnnouncementCommentDto[]
|
||||||
departments?: string[]
|
departments?: string[]
|
||||||
attachments?: { name: string; url: string; size: string }[]
|
attachments?: { name: string; url: string; size: string }[]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,12 @@
|
||||||
import { EventCommentDto, EventDto, IntranetDashboardDto, SocialCommentDto, SocialPostDto } from '@/proxy/intranet/models'
|
import {
|
||||||
|
AnnouncementCommentDto,
|
||||||
|
AnnouncementDto,
|
||||||
|
EventCommentDto,
|
||||||
|
EventDto,
|
||||||
|
IntranetDashboardDto,
|
||||||
|
SocialCommentDto,
|
||||||
|
SocialPostDto,
|
||||||
|
} from '@/proxy/intranet/models'
|
||||||
import apiService, { Config } from './api.service'
|
import apiService, { Config } from './api.service'
|
||||||
|
|
||||||
export interface CreateSocialPostInput {
|
export interface CreateSocialPostInput {
|
||||||
|
|
@ -106,6 +114,39 @@ export class IntranetService {
|
||||||
{ apiName: this.apiName, ...config },
|
{ apiName: this.apiName, ...config },
|
||||||
)
|
)
|
||||||
|
|
||||||
|
getAnnouncementComments = (announcementId: string, config?: Partial<Config>) =>
|
||||||
|
apiService.fetchData<AnnouncementCommentDto[]>(
|
||||||
|
{
|
||||||
|
method: 'GET',
|
||||||
|
url: `/api/app/intranet/announcement-comments/${announcementId}`,
|
||||||
|
},
|
||||||
|
{ apiName: this.apiName, ...config },
|
||||||
|
)
|
||||||
|
|
||||||
|
createAnnouncementComment = (
|
||||||
|
announcementId: string,
|
||||||
|
content: string,
|
||||||
|
config?: Partial<Config>,
|
||||||
|
) =>
|
||||||
|
apiService.fetchData<AnnouncementCommentDto>(
|
||||||
|
{
|
||||||
|
method: 'POST',
|
||||||
|
url: `/api/app/intranet/announcement-comment/${announcementId}`,
|
||||||
|
params: { content },
|
||||||
|
},
|
||||||
|
{ apiName: this.apiName, ...config },
|
||||||
|
)
|
||||||
|
|
||||||
|
likeAnnouncement = (id: string, config?: Partial<Config>) =>
|
||||||
|
apiService.fetchData<AnnouncementDto>(
|
||||||
|
{
|
||||||
|
method: 'POST',
|
||||||
|
url: `/api/app/intranet/like-announcement`,
|
||||||
|
params: { id },
|
||||||
|
},
|
||||||
|
{ apiName: this.apiName, ...config },
|
||||||
|
)
|
||||||
|
|
||||||
getEventComments = (eventId: string, config?: Partial<Config>) =>
|
getEventComments = (eventId: string, config?: Partial<Config>) =>
|
||||||
apiService.fetchData<EventCommentDto[]>(
|
apiService.fetchData<EventCommentDto[]>(
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import React, { useEffect, useState } from 'react'
|
import React, { useEffect, useRef, useState } from 'react'
|
||||||
import { createPortal } from 'react-dom'
|
import { createPortal } from 'react-dom'
|
||||||
import { useLocalization } from '@/utils/hooks/useLocalization'
|
import { useLocalization } from '@/utils/hooks/useLocalization'
|
||||||
import { motion, AnimatePresence } from 'framer-motion'
|
import { motion, AnimatePresence } from 'framer-motion'
|
||||||
|
|
@ -9,15 +9,22 @@ import {
|
||||||
FaChevronLeft,
|
FaChevronLeft,
|
||||||
FaChevronRight,
|
FaChevronRight,
|
||||||
FaExpand,
|
FaExpand,
|
||||||
|
FaCommentAlt,
|
||||||
|
FaPaperPlane,
|
||||||
|
FaHeart,
|
||||||
} from 'react-icons/fa'
|
} from 'react-icons/fa'
|
||||||
import { Dialog } from '@/components/ui'
|
import { Dialog } from '@/components/ui'
|
||||||
import { useDialogContext } from '@/components/ui/Dialog/Dialog'
|
import { useDialogContext } from '@/components/ui/Dialog/Dialog'
|
||||||
import { AnnouncementDto } from '@/proxy/intranet/models'
|
import { AnnouncementCommentDto, AnnouncementDto } from '@/proxy/intranet/models'
|
||||||
import useLocale from '@/utils/hooks/useLocale'
|
import useLocale from '@/utils/hooks/useLocale'
|
||||||
import { currentLocalDate } from '@/utils/dateUtils'
|
import { currentLocalDate } from '@/utils/dateUtils'
|
||||||
import Avatar from '@/components/ui/Avatar/Avatar'
|
import Avatar from '@/components/ui/Avatar/Avatar'
|
||||||
import { AVATAR_URL } from '@/constants/app.constant'
|
import { AVATAR_URL } from '@/constants/app.constant'
|
||||||
import { intranetService } from '@/services/intranet.service'
|
import { intranetService } from '@/services/intranet.service'
|
||||||
|
import dayjs from 'dayjs'
|
||||||
|
import relativeTime from 'dayjs/plugin/relativeTime'
|
||||||
|
|
||||||
|
dayjs.extend(relativeTime)
|
||||||
|
|
||||||
interface AnnouncementModalProps {
|
interface AnnouncementModalProps {
|
||||||
announcement: AnnouncementDto
|
announcement: AnnouncementDto
|
||||||
|
|
@ -31,6 +38,13 @@ function AnnouncementModalContent({ announcement, onClose }: AnnouncementModalPr
|
||||||
const [activePhoto, setActivePhoto] = useState(0)
|
const [activePhoto, setActivePhoto] = useState(0)
|
||||||
const [lightboxOpen, setLightboxOpen] = useState(false)
|
const [lightboxOpen, setLightboxOpen] = useState(false)
|
||||||
const [lightboxIndex, setLightboxIndex] = useState(0)
|
const [lightboxIndex, setLightboxIndex] = useState(0)
|
||||||
|
const [comments, setComments] = useState<AnnouncementCommentDto[]>(announcement.comments || [])
|
||||||
|
const [commentText, setCommentText] = useState('')
|
||||||
|
const [submitting, setSubmitting] = useState(false)
|
||||||
|
const [likes, setLikes] = useState(announcement.likes ?? 0)
|
||||||
|
const [isLiked, setIsLiked] = useState(announcement.isLiked ?? false)
|
||||||
|
const [liking, setLiking] = useState(false)
|
||||||
|
const commentsEndRef = useRef<HTMLDivElement>(null)
|
||||||
|
|
||||||
const openLightbox = (idx: number) => {
|
const openLightbox = (idx: number) => {
|
||||||
setLightboxIndex(idx)
|
setLightboxIndex(idx)
|
||||||
|
|
@ -50,6 +64,60 @@ function AnnouncementModalContent({ announcement, onClose }: AnnouncementModalPr
|
||||||
intranetService.incrementAnnouncementViewCount(announcement.id)
|
intranetService.incrementAnnouncementViewCount(announcement.id)
|
||||||
}, [announcement.id])
|
}, [announcement.id])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
intranetService.getAnnouncementComments(announcement.id).then((res) => {
|
||||||
|
if (res.data) setComments(res.data)
|
||||||
|
})
|
||||||
|
}, [announcement.id])
|
||||||
|
|
||||||
|
const scrollToBottom = () => {
|
||||||
|
commentsEndRef.current?.scrollIntoView({ behavior: 'smooth' })
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleSubmitComment = async () => {
|
||||||
|
if (!commentText.trim() || submitting) return
|
||||||
|
setSubmitting(true)
|
||||||
|
try {
|
||||||
|
const res = await intranetService.createAnnouncementComment(
|
||||||
|
announcement.id,
|
||||||
|
commentText.trim(),
|
||||||
|
)
|
||||||
|
if (res.data) {
|
||||||
|
setComments((prev) => [...prev, res.data!])
|
||||||
|
setCommentText('')
|
||||||
|
setTimeout(scrollToBottom, 100)
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
setSubmitting(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {
|
||||||
|
if (e.key === 'Enter' && !e.shiftKey) {
|
||||||
|
e.preventDefault()
|
||||||
|
handleSubmitComment()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleLike = async () => {
|
||||||
|
if (liking) return
|
||||||
|
setLiking(true)
|
||||||
|
setIsLiked((prev) => !prev)
|
||||||
|
setLikes((prev) => (isLiked ? Math.max(0, prev - 1) : prev + 1))
|
||||||
|
try {
|
||||||
|
const res = await intranetService.likeAnnouncement(announcement.id)
|
||||||
|
if (res.data) {
|
||||||
|
setLikes(res.data.likes ?? 0)
|
||||||
|
setIsLiked(res.data.isLiked ?? false)
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
setIsLiked((prev) => !prev)
|
||||||
|
setLikes((prev) => (isLiked ? prev + 1 : Math.max(0, prev - 1)))
|
||||||
|
} finally {
|
||||||
|
setLiking(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const announcementUser = announcement.user ?? {}
|
const announcementUser = announcement.user ?? {}
|
||||||
const announcementUserName =
|
const announcementUserName =
|
||||||
announcementUser.fullName ||
|
announcementUser.fullName ||
|
||||||
|
|
@ -129,6 +197,19 @@ function AnnouncementModalContent({ announcement, onClose }: AnnouncementModalPr
|
||||||
{announcement.viewCount}{' '}
|
{announcement.viewCount}{' '}
|
||||||
{translate('::App.Platform.Intranet.AnnouncementDetailModal.Views')}
|
{translate('::App.Platform.Intranet.AnnouncementDetailModal.Views')}
|
||||||
</span>
|
</span>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={handleLike}
|
||||||
|
disabled={liking}
|
||||||
|
className={`flex items-center gap-2 border-0 transition-colors text-xs font-medium ${
|
||||||
|
isLiked
|
||||||
|
? 'bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800 text-red-600 dark:text-red-400 hover:bg-red-100 dark:hover:bg-red-900/40'
|
||||||
|
: 'bg-white dark:bg-gray-700 border-gray-200 dark:border-gray-600 text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-600'
|
||||||
|
} disabled:opacity-50 disabled:cursor-not-allowed`}
|
||||||
|
>
|
||||||
|
<FaHeart className={`w-4 h-4 ${isLiked ? 'text-red-500' : ''}`} />
|
||||||
|
{likes > 0 && likes}
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -272,13 +353,75 @@ function AnnouncementModalContent({ announcement, onClose }: AnnouncementModalPr
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
<div className="mt-6 pt-4 border-t border-gray-200 dark:border-gray-700">
|
||||||
|
<h3 className="text-sm font-semibold text-gray-900 dark:text-white flex items-center gap-2 mb-2">
|
||||||
|
<FaCommentAlt className="w-4 h-4 text-blue-500" />
|
||||||
|
{translate('::App.Intranet.Events.Comments')} ({comments.length})
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<div className="max-h-64 overflow-y-auto space-y-3">
|
||||||
|
{comments.length === 0 ? (
|
||||||
|
<p className="text-sm text-gray-400 dark:text-gray-500 text-center">
|
||||||
|
{translate('::App.Intranet.Events.NoComment')}
|
||||||
|
</p>
|
||||||
|
) : (
|
||||||
|
comments.map((comment) => (
|
||||||
|
<div key={comment.id} className="flex gap-3">
|
||||||
|
{comment.user && (
|
||||||
|
<Avatar
|
||||||
|
size={32}
|
||||||
|
shape="circle"
|
||||||
|
src={AVATAR_URL(comment.user.id, comment.user.tenantId)}
|
||||||
|
className="flex-shrink-0"
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
<div className="flex-1 min-w-0">
|
||||||
|
<div className="bg-gray-50 dark:bg-gray-700/60 rounded-xl px-3 py-2">
|
||||||
|
<p className="text-xs font-semibold text-gray-800 dark:text-gray-200">
|
||||||
|
{comment.user?.fullName ?? 'Kullanıcı'}
|
||||||
|
</p>
|
||||||
|
<p className="text-sm text-gray-700 dark:text-gray-300 mt-0.5 whitespace-pre-line">
|
||||||
|
{comment.content}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<p className="text-xs text-gray-400 dark:text-gray-500 mt-1 px-1">
|
||||||
|
{dayjs(comment.creationTime).fromNow()}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))
|
||||||
|
)}
|
||||||
|
<div ref={commentsEndRef} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Dialog.Body>
|
</Dialog.Body>
|
||||||
|
|
||||||
<Dialog.Footer className="pt-4 border-t border-gray-200 dark:border-gray-700 flex-shrink-0">
|
<Dialog.Footer className="p-1 pt-2 border-t border-gray-200 dark:border-gray-700 flex-shrink-0 flex items-end gap-3">
|
||||||
|
<div className="flex flex-1 gap-2 items-end">
|
||||||
|
<textarea
|
||||||
|
value={commentText}
|
||||||
|
autoFocus
|
||||||
|
onChange={(e) => setCommentText(e.target.value)}
|
||||||
|
onKeyDown={handleKeyDown}
|
||||||
|
placeholder={translate('::App.Platform.Intranet.SocialWall.PostItem.CommentPlaceholder')}
|
||||||
|
rows={1}
|
||||||
|
className="flex-1 resize-none px-3 py-2 text-sm rounded-xl border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 transition-colors"
|
||||||
|
/>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={handleSubmitComment}
|
||||||
|
disabled={!commentText.trim() || submitting}
|
||||||
|
className="p-2.5 bg-blue-500 hover:bg-blue-600 disabled:opacity-50 disabled:cursor-not-allowed text-white rounded-xl transition-colors flex-shrink-0"
|
||||||
|
>
|
||||||
|
<FaPaperPlane className="w-4 h-4" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
<button
|
<button
|
||||||
onClick={onClose}
|
onClick={onClose}
|
||||||
className="w-full px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg transition-colors"
|
type="button"
|
||||||
|
className="px-2 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg transition-colors text-sm font-medium flex-shrink-0"
|
||||||
>
|
>
|
||||||
{translate('::App.Platform.Close')}
|
{translate('::App.Platform.Close')}
|
||||||
</button>
|
</button>
|
||||||
|
|
|
||||||
|
|
@ -284,7 +284,7 @@ function EventModalContent({ event, onClose }: EventModalProps) {
|
||||||
<div className="max-h-64 overflow-y-auto">
|
<div className="max-h-64 overflow-y-auto">
|
||||||
{comments.length === 0 ? (
|
{comments.length === 0 ? (
|
||||||
<p className="text-sm text-gray-400 dark:text-gray-500 text-center">
|
<p className="text-sm text-gray-400 dark:text-gray-500 text-center">
|
||||||
{translate('::App.Intranet.Events.EventComment')}
|
{translate('::App.Intranet.Events.NoComment')}
|
||||||
</p>
|
</p>
|
||||||
) : (
|
) : (
|
||||||
comments.map((comment) => (
|
comments.map((comment) => (
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue