mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-07-10 02:45:08 +00:00
Monotone-Parent: 4f0272f926f26c8a39d7b00154a9b6dd2d17a27a
Monotone-Revision: 5369f3639a0ee9aca9aab181450a38f9e22e9b47 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2007-06-19T17:56:35 Monotone-Branch: ca.inverse.sogo
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
2007-06-19 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
|
||||
* UI/Scheduler/UIxTaskView.[hm]: removed unused module.
|
||||
|
||||
* UI/Scheduler/UIxAppointmentView.[hm]: removed unused module.
|
||||
|
||||
* SoObjects/SOGo/WOContext+Agenor.[hm]: removed unused module.
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
// $Id: UIxTaskView.h 768 2005-07-15 00:13:01Z helge $
|
||||
|
||||
#ifndef __SOGo_UIxTaskView_H__
|
||||
#define __SOGo_UIxTaskView_H__
|
||||
|
||||
#include <SOGoUI/UIxComponent.h>
|
||||
|
||||
@class NSCalendarDate;
|
||||
@class iCalToDo;
|
||||
@class iCalPerson;
|
||||
@class SOGoDateFormatter;
|
||||
|
||||
@interface UIxTaskView : UIxComponent
|
||||
{
|
||||
iCalToDo* task;
|
||||
iCalPerson* attendee;
|
||||
SOGoDateFormatter *dateFormatter;
|
||||
id item;
|
||||
}
|
||||
|
||||
- (iCalToDo *) task;
|
||||
|
||||
/* permissions */
|
||||
- (BOOL)canAccessApt;
|
||||
- (BOOL)canEditApt;
|
||||
|
||||
- (SOGoDateFormatter *)dateFormatter;
|
||||
- (NSCalendarDate *)startTime;
|
||||
- (NSCalendarDate *)endTime;
|
||||
|
||||
- (NSString *)attributesTabLink;
|
||||
- (NSString *)participantsTabLink;
|
||||
|
||||
- (NSString *)completeHrefForMethod:(NSString *)_method
|
||||
withParameter:(NSString *)_param
|
||||
forKey:(NSString *)_key;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __SOGo_UIxTaskView_H__ */
|
||||
@@ -1,294 +0,0 @@
|
||||
/*
|
||||
Copyright (C) 2004-2005 SKYRIX Software AG
|
||||
|
||||
This file is part of OpenGroupware.org.
|
||||
|
||||
OGo is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU Lesser General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
OGo is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with OGo; see the file COPYING. If not, write to the
|
||||
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import "UIxTaskView.h"
|
||||
#import <NGCards/NGCards.h>
|
||||
#import <SOGo/WOContext+Agenor.h>
|
||||
#import <SOGo/SOGoUser.h>
|
||||
#import <Appointments/SOGoTaskObject.h>
|
||||
#import <SOGoUI/SOGoDateFormatter.h>
|
||||
#import "UIxComponent+Scheduler.h"
|
||||
#import "common.h"
|
||||
|
||||
@interface UIxTaskView (PrivateAPI)
|
||||
- (BOOL)isAttendeeActiveUser;
|
||||
@end
|
||||
|
||||
@implementation UIxTaskView
|
||||
|
||||
- (void)dealloc {
|
||||
[task release];
|
||||
[attendee release];
|
||||
[dateFormatter release];
|
||||
[item release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
/* accessors */
|
||||
|
||||
- (NSString *)tabSelection {
|
||||
NSString *selection;
|
||||
|
||||
selection = [self queryParameterForKey:@"tab"];
|
||||
if (selection == nil)
|
||||
selection = @"attributes";
|
||||
return selection;
|
||||
}
|
||||
|
||||
- (void)setAttendee:(id)_attendee {
|
||||
ASSIGN(attendee, _attendee);
|
||||
}
|
||||
- (id)attendee {
|
||||
return attendee;
|
||||
}
|
||||
|
||||
- (BOOL)isAttendeeActiveUser {
|
||||
NSString *email, *attEmail;
|
||||
|
||||
email = [[[self context] activeUser] primaryEmail];
|
||||
attendee = [self attendee];
|
||||
attEmail = [attendee rfc822Email];
|
||||
|
||||
return [email isEqualToString: attEmail];
|
||||
}
|
||||
|
||||
- (BOOL)showAcceptButton {
|
||||
return [[self attendee] participationStatus] != iCalPersonPartStatAccepted;
|
||||
}
|
||||
- (BOOL)showRejectButton {
|
||||
return [[self attendee] participationStatus] != iCalPersonPartStatDeclined;
|
||||
}
|
||||
- (NSString *)attendeeStatusColspan {
|
||||
return [self isAttendeeActiveUser] ? @"1" : @"2";
|
||||
}
|
||||
|
||||
- (void)setItem:(id)_item {
|
||||
ASSIGN(item, _item);
|
||||
}
|
||||
- (id)item {
|
||||
return item;
|
||||
}
|
||||
|
||||
- (SOGoDateFormatter *)dateFormatter {
|
||||
if (dateFormatter == nil) {
|
||||
dateFormatter =
|
||||
[[SOGoDateFormatter alloc] initWithLocale:[self locale]];
|
||||
[dateFormatter setFullWeekdayNameAndDetails];
|
||||
}
|
||||
return dateFormatter;
|
||||
}
|
||||
|
||||
- (NSCalendarDate *) startTime
|
||||
{
|
||||
NSCalendarDate *date;
|
||||
NSTimeZone *timeZone;
|
||||
|
||||
timeZone = [[context activeUser] timeZone];
|
||||
date = [[self task] startDate];
|
||||
[date setTimeZone: timeZone];
|
||||
|
||||
return date;
|
||||
}
|
||||
|
||||
- (NSCalendarDate *) endTime
|
||||
{
|
||||
NSCalendarDate *date;
|
||||
NSTimeZone *timeZone;
|
||||
|
||||
timeZone = [[context activeUser] timeZone];
|
||||
date = [[self task] due];
|
||||
[date setTimeZone: timeZone];
|
||||
|
||||
return date;
|
||||
}
|
||||
|
||||
- (NSString *)resourcesAsString {
|
||||
NSArray *resources, *cns;
|
||||
|
||||
resources = [[self task] resources];
|
||||
cns = [resources valueForKey:@"cnForDisplay"];
|
||||
return [cns componentsJoinedByString:@"<br />"];
|
||||
}
|
||||
|
||||
- (NSString *) categoriesAsString
|
||||
{
|
||||
NSEnumerator *categories;
|
||||
NSArray *rawCategories;
|
||||
NSMutableArray *l10nCategories;
|
||||
NSString *currentCategory, *l10nCategory;
|
||||
|
||||
rawCategories
|
||||
= [[task categories] componentsSeparatedByString: @","];
|
||||
l10nCategories = [NSMutableArray arrayWithCapacity: [rawCategories count]];
|
||||
categories = [rawCategories objectEnumerator];
|
||||
currentCategory = [categories nextObject];
|
||||
while (currentCategory)
|
||||
{
|
||||
l10nCategory
|
||||
= [self labelForKey: [currentCategory stringByTrimmingSpaces]];
|
||||
if (l10nCategory)
|
||||
[l10nCategories addObject: l10nCategory];
|
||||
currentCategory = [categories nextObject];
|
||||
}
|
||||
|
||||
return [l10nCategories componentsJoinedByString: @", "];
|
||||
}
|
||||
|
||||
// task.organizer.cnForDisplay
|
||||
- (NSString *) eventOrganizer
|
||||
{
|
||||
CardElement *organizer;
|
||||
|
||||
organizer = [[self task] uniqueChildWithTag: @"organizer"];
|
||||
|
||||
return [organizer value: 0 ofAttribute: @"cn"];
|
||||
}
|
||||
|
||||
- (NSString *) priorityLabelKey
|
||||
{
|
||||
return [NSString stringWithFormat: @"prio_%@", [task priority]];
|
||||
}
|
||||
|
||||
/* backend */
|
||||
|
||||
- (iCalToDo *) task
|
||||
{
|
||||
SOGoTaskObject *clientObject;
|
||||
|
||||
if (!task)
|
||||
{
|
||||
clientObject = [self clientObject];
|
||||
task = (iCalToDo *) [clientObject component: NO];
|
||||
[task retain];
|
||||
}
|
||||
|
||||
return task;
|
||||
}
|
||||
|
||||
/* hrefs */
|
||||
|
||||
- (NSString *)attributesTabLink {
|
||||
return [self completeHrefForMethod:[self ownMethodName]
|
||||
withParameter:@"attributes"
|
||||
forKey:@"tab"];
|
||||
}
|
||||
|
||||
- (NSString *)participantsTabLink {
|
||||
return [self completeHrefForMethod:[self ownMethodName]
|
||||
withParameter:@"participants"
|
||||
forKey:@"tab"];
|
||||
}
|
||||
|
||||
- (NSString *)debugTabLink {
|
||||
return [self completeHrefForMethod:[self ownMethodName]
|
||||
withParameter:@"debug"
|
||||
forKey:@"tab"];
|
||||
}
|
||||
|
||||
- (NSString *)completeHrefForMethod:(NSString *)_method
|
||||
withParameter:(NSString *)_param
|
||||
forKey:(NSString *)_key
|
||||
{
|
||||
NSString *href;
|
||||
|
||||
[self setQueryParameter:_param forKey:_key];
|
||||
href = [self completeHrefForMethod:[self ownMethodName]];
|
||||
[self setQueryParameter:nil forKey:_key];
|
||||
return href;
|
||||
}
|
||||
|
||||
|
||||
/* access */
|
||||
|
||||
- (BOOL)isMyApt {
|
||||
NSString *email;
|
||||
iCalPerson *organizer;
|
||||
|
||||
email = [[[self context] activeUser] primaryEmail];
|
||||
organizer = [[self task] organizer];
|
||||
if (!organizer) return YES; // assume this is correct to do, right?
|
||||
return [[organizer rfc822Email] isEqualToString:email];
|
||||
}
|
||||
|
||||
- (BOOL)canAccessApt {
|
||||
NSString *email;
|
||||
NSArray *partMails;
|
||||
|
||||
if ([self isMyApt])
|
||||
return YES;
|
||||
|
||||
/* not my apt - can access if it's public */
|
||||
if ([[[self task] accessClass] isEqualToString: @"PUBLIC"])
|
||||
return YES;
|
||||
|
||||
/* can access it if I'm invited :-) */
|
||||
email = [[[self context] activeUser] primaryEmail];
|
||||
partMails = [[[self task] participants] valueForKey:@"rfc822Email"];
|
||||
return [partMails containsObject: email];
|
||||
}
|
||||
|
||||
- (BOOL)canEditApt {
|
||||
return [self isMyApt];
|
||||
}
|
||||
|
||||
|
||||
/* action */
|
||||
|
||||
- (id<WOActionResults>)defaultAction {
|
||||
if ([self task] == nil) {
|
||||
return [NSException exceptionWithHTTPStatus:404 /* Not Found */
|
||||
reason:@"could not locate task"];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (BOOL)isDeletableClientObject {
|
||||
return [[self clientObject] respondsToSelector:@selector(delete)];
|
||||
}
|
||||
|
||||
- (id)deleteAction {
|
||||
NSException *ex;
|
||||
id url;
|
||||
|
||||
if ([self task] == nil) {
|
||||
return [NSException exceptionWithHTTPStatus:404 /* Not Found */
|
||||
reason:@"could not locate task"];
|
||||
}
|
||||
|
||||
if (![self isDeletableClientObject]) {
|
||||
/* return 400 == Bad Request */
|
||||
return [NSException exceptionWithHTTPStatus:400
|
||||
reason:@"method cannot be invoked on "
|
||||
@"the specified object"];
|
||||
}
|
||||
|
||||
if ((ex = [[self clientObject] delete]) != nil) {
|
||||
// TODO: improve error handling
|
||||
[self debugWithFormat:@"failed to delete: %@", ex];
|
||||
return ex;
|
||||
}
|
||||
|
||||
url = [[[self clientObject] container] baseURLInContext:[self context]];
|
||||
return [self redirectToLocation:url];
|
||||
}
|
||||
|
||||
@end /* UIxTaskView */
|
||||
@@ -1,299 +0,0 @@
|
||||
<?xml version='1.0' standalone='yes'?>
|
||||
<var:component xmlns="http://www.w3.org/1999/xhtml"
|
||||
xmlns:var="http://www.skyrix.com/od/binding"
|
||||
xmlns:const="http://www.skyrix.com/od/constant"
|
||||
xmlns:uix="OGo:uix"
|
||||
xmlns:label="OGo:label"
|
||||
className="UIxPageFrame"
|
||||
title="name"
|
||||
const:popup="YES"
|
||||
>
|
||||
<table cellspacing="0" cellpadding="5" width="100%">
|
||||
<tr>
|
||||
<td class="window_label"
|
||||
><var:string label:value="Appointment viewer" /></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<table border="0" cellpadding="2" width="100%" cellspacing="0">
|
||||
<tr bgcolor="#e8e8e0">
|
||||
<td align="left">
|
||||
<span class="aptview_title"
|
||||
><var:string value="startTime"
|
||||
formatter="dateFormatter"
|
||||
/></span>
|
||||
</td>
|
||||
<td align="right" >
|
||||
<table border='0' cellpadding='0' cellspacing='1'>
|
||||
<tr>
|
||||
<td class="button_auto_env" nowrap="true"
|
||||
valign='middle' align='center'>
|
||||
<!--<a class="button_auto"
|
||||
href="printview"
|
||||
var:queryDictionary="queryParameters"
|
||||
target="SOGoPrintView"
|
||||
><var:string label:value="printview" /></a>-->
|
||||
</td>
|
||||
<var:if condition="canEditApt">
|
||||
<td class="button_auto_env" nowrap="true"
|
||||
valign='middle' align='center'>
|
||||
<a class="button_auto"
|
||||
href="edit"
|
||||
var:queryDictionary="queryParameters"
|
||||
><var:string label:value="edit" /></a>
|
||||
</td>
|
||||
<td class="button_auto_env" nowrap="true"
|
||||
valign='middle' align='center'>
|
||||
<a class="button_auto"
|
||||
href="delete"
|
||||
var:queryDictionary="queryParameters"
|
||||
><var:string label:value="delete" /></a>
|
||||
</td>
|
||||
</var:if>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top" width="100%">
|
||||
<table width="100%" border="0" cellpadding="4" cellspacing="0">
|
||||
<!-- general appointment info -->
|
||||
<var:if condition="canAccessApt">
|
||||
<tr valign="top">
|
||||
<td align="right" width="15%" bgcolor="#E8E8E0" class="aptview_text">
|
||||
<var:string label:value="Title" />:
|
||||
</td>
|
||||
<td align="left" bgcolor="#FFFFF0" class="aptview_text">
|
||||
<var:string value="appointment.summary" const:escapeHTML="NO" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr valign="top">
|
||||
<td align="right" width="15%" bgcolor="#E8E8E0" class="aptview_text">
|
||||
<var:string label:value="Location" />:
|
||||
</td>
|
||||
<td align="left" bgcolor="#FFFFF0" class="aptview_text">
|
||||
<var:string value="appointment.location" const:escapeHTML="NO" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr valign="top">
|
||||
<td align="right" width="15%" bgcolor="#E8E8E0" class="aptview_text">
|
||||
<var:string label:value="Priority" />:
|
||||
</td>
|
||||
<td align="left" bgcolor="#FFFFF0" class="aptview_text">
|
||||
<var:string label:value="$priorityLabelKey" />
|
||||
</td>
|
||||
</tr>
|
||||
</var:if>
|
||||
<tr valign="top">
|
||||
<td align="right" width="15%" bgcolor="#E8E8E0" class="aptview_text">
|
||||
<var:string label:value="Classification" />:
|
||||
</td>
|
||||
<td align="left" bgcolor="#FFFFF0" class="aptview_text">
|
||||
<var:if condition="appointment.isPublic">Public</var:if>
|
||||
<var:if condition="appointment.isPublic"
|
||||
const:negate="YES"
|
||||
>Private</var:if>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top" width="100%">
|
||||
<uix:tabview var:selection="tabSelection"
|
||||
const:tabStyle="tab"
|
||||
const:selectedTabStyle="tab_selected"
|
||||
const:bodyStyle="tabview_body"
|
||||
>
|
||||
<uix:tab const:key="attributes"
|
||||
label:label="attributes"
|
||||
var:href="attributesTabLink"
|
||||
>
|
||||
<table width="100%" border="0" cellpadding="4" cellspacing="0">
|
||||
<tr valign="top">
|
||||
<td align="right"
|
||||
width="15%"
|
||||
bgcolor="#E8E8E0"
|
||||
class="aptview_text"
|
||||
>
|
||||
<var:string label:value="Start time" />:
|
||||
</td>
|
||||
<td align="left" bgcolor="#FFFFF0" class="aptview_text">
|
||||
<var:string value="startTime"
|
||||
formatter="dateFormatter"
|
||||
/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr valign="top">
|
||||
<td align="right"
|
||||
width="15%"
|
||||
bgcolor="#E8E8E0"
|
||||
class="aptview_text"
|
||||
>
|
||||
<var:string label:value="End time" />:
|
||||
</td>
|
||||
<td align="left" bgcolor="#FFFFF0" class="aptview_text">
|
||||
<var:string value="endTime"
|
||||
formatter="dateFormatter"
|
||||
/>
|
||||
</td>
|
||||
</tr>
|
||||
<var:if condition="canAccessApt">
|
||||
<tr valign="top">
|
||||
<td align="right"
|
||||
width="15%"
|
||||
bgcolor="#E8E8E0"
|
||||
class="aptview_text"
|
||||
>
|
||||
<var:string label:value="Categories" />:
|
||||
</td>
|
||||
<td align="left" bgcolor="#FFFFF0" class="aptview_text">
|
||||
<var:string value="categoriesAsString" const:escapeHTML="NO" />
|
||||
</td>
|
||||
</tr>
|
||||
<!-- Resources removed for v0.8
|
||||
<tr valign="top">
|
||||
<td align="right"
|
||||
width="15%"
|
||||
bgcolor="#E8E8E0"
|
||||
class="aptview_text"
|
||||
>
|
||||
<var:string label:value="Resources" />:
|
||||
</td>
|
||||
<td align="left" bgcolor="#FFFFF0" class="aptview_text">
|
||||
<var:string value="resourcesAsString"
|
||||
const:escapeHTML="NO"
|
||||
/>
|
||||
</td>
|
||||
</tr>
|
||||
-->
|
||||
<tr valign="top">
|
||||
<td align="right"
|
||||
width="15%"
|
||||
bgcolor="#E8E8E0"
|
||||
class="aptview_text"
|
||||
>
|
||||
<var:string label:value="Organizer" />:
|
||||
</td>
|
||||
<td align="left" bgcolor="#FFFFF0" class="aptview_text">
|
||||
<var:string value="eventOrganizer" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr valign="top">
|
||||
<td align="right"
|
||||
width="15%"
|
||||
bgcolor="#E8E8E0"
|
||||
class="aptview_text"
|
||||
>
|
||||
<var:string label:value="Comment" />:
|
||||
</td>
|
||||
<td align="left" bgcolor="#FFFFF0" class="aptview_text">
|
||||
<var:string value="appointment.comment" const:insertBR="1"
|
||||
const:escapeHTML="NO" />
|
||||
</td>
|
||||
</tr>
|
||||
</var:if>
|
||||
</table>
|
||||
</uix:tab>
|
||||
<var:if condition="canAccessApt">
|
||||
|
||||
<uix:tab const:key="participants"
|
||||
label:label="participants"
|
||||
var:href="participantsTabLink"
|
||||
>
|
||||
<table width="100%" border="0" cellpadding="4" cellspacing="0">
|
||||
<tr valign="top">
|
||||
<td align="left" bgcolor="#E8E8E0" class="aptview_title">
|
||||
<var:string label:value="Name" />
|
||||
</td>
|
||||
<td align="left" bgcolor="#E8E8E0" class="aptview_title">
|
||||
<var:string label:value="Email" />
|
||||
</td>
|
||||
<td align="left"
|
||||
bgcolor="#E8E8E0"
|
||||
class="aptview_title"
|
||||
colspan="2"
|
||||
>
|
||||
<var:string label:value="Status" />
|
||||
</td>
|
||||
</tr>
|
||||
<var:foreach list="appointment.participants"
|
||||
item="attendee"
|
||||
>
|
||||
<tr valign="top">
|
||||
<td align="left" bgcolor="#FFFFF0" class="aptview_text">
|
||||
<var:string value="attendee.cnForDisplay" />
|
||||
</td>
|
||||
<td align="left" bgcolor="#FFFFF0" class="aptview_text">
|
||||
<a var:href="attendee.email"
|
||||
><var:string value="attendee.rfc822Email" /></a>
|
||||
</td>
|
||||
<td align="left"
|
||||
bgcolor="#FFFFF0"
|
||||
class="aptview_text"
|
||||
var:colspan="attendeeStatusColspan"
|
||||
>
|
||||
<var:component className="UIxCalParticipationStatusView"
|
||||
partStat="attendee.participationStatus"
|
||||
/>
|
||||
</td>
|
||||
<var:if condition="isAttendeeActiveUser">
|
||||
<td align="left"
|
||||
bgcolor="#FFFFF0"
|
||||
class="button_auto_env"
|
||||
>
|
||||
<var:if condition="showAcceptButton">
|
||||
<a href="accept"
|
||||
class="button_auto"
|
||||
_tab="participants"
|
||||
><var:string label:value="accept" /></a>
|
||||
</var:if>
|
||||
<var:if condition="showRejectButton">
|
||||
<a href="decline"
|
||||
class="button_auto"
|
||||
_tab="participants"
|
||||
><var:string label:value="decline" /></a>
|
||||
</var:if>
|
||||
</td>
|
||||
</var:if>
|
||||
</tr>
|
||||
</var:foreach>
|
||||
</table>
|
||||
</uix:tab>
|
||||
</var:if>
|
||||
<var:if condition="isUIxDebugEnabled">
|
||||
<uix:tab const:key="debug"
|
||||
const:label="DEBUG"
|
||||
var:href="debugTabLink">
|
||||
SOGo Server - <var:string value="name"/>
|
||||
<br />
|
||||
Client: <var:string value="clientObject"/>
|
||||
<br />
|
||||
Group: <var:string value="clientObject.group"
|
||||
/><br />
|
||||
Deletable: <var:string value="clientObject.isDeletionAllowed"
|
||||
/><br />
|
||||
Generation: <var:string value="clientObject.zlGenerationCount"
|
||||
/><br />
|
||||
MsgClass: <var:string value="clientObject.outlookMessageClass"
|
||||
/><br />
|
||||
|
||||
<hr />
|
||||
As iCal:<br />
|
||||
<pre><var:string value="clientObject.iCalString"/></pre>
|
||||
|
||||
<hr />
|
||||
As Mail:<br />
|
||||
<pre><var:string value="clientObject.iCalMailString"/></pre>
|
||||
|
||||
</uix:tab>
|
||||
</var:if>
|
||||
</uix:tabview>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</var:component>
|
||||
Reference in New Issue
Block a user